Leetcode 239. Sliding Window Maximum

Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position.

For example, Given nums = [1,3,-1,-3,5,3,6,7], and k = 3.

Window position                Max
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

Therefore, return the max sliding window as [3,3,5,5,6,7].

Note:  You may assume k is always valid, ie: 1 ≤ k ≤ input array's size for non-empty array.

Follow up: Could you solve it in linear time?

用一个滑窗在数组上滑动,求滑动到每个位置时,滑窗内数字的最大值,线性时间内完成。

使用双端队列完成,队列记录数组中的下标,维护多个单调递减区间。

当当前下标和队列首的元素相差超过k-1时,说明滑窗超过了既定大小,需要把前一个元素扔掉。

因为要维护单调递增,所以每次加入一个新的下标时,需要将新加入的数和队列尾的数字比较,扔掉比新加入的数小的数,因为它们不可能是滑窗内的最大值。

当下标大于等于k-1的时候,说明要开始记录滑窗的最大值了。

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> res;
        deque<int> q;
        for(int i = 0; i < nums.size(); i++)
        {
            if(!q.empty() && i - q.front() >= k) q.pop_front();
            while(!q.empty() && nums[q.back()] <= nums[i]) q.pop_back();
            q.push_back(i);
            if(i >= k - 1) res.push_back(nums[q.front()]);
        }
        return res;
    }
};

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hanlp学习笔记

hanlp中的N最短路径分词

N-最短路径 是中科院分词工具NLPIR进行分词用到的一个重要算法,张华平、刘群老师在论文《基于N-最短路径方法的中文词语粗分模型》中做了比较详细的介绍。该算法...

17300
来自专栏逆向技术

逆向课程第五讲逆向中的优化方式,除法原理,以及除法优化下

        逆向课程第五讲逆向中的优化方式,除法原理,以及除法优化下 一丶除法的优化 1.有符号被除数 / 无符号除数的情况下 高级代码为: ? 汇编中优化...

22650
来自专栏程序生活

Python json 模块dumps、dump、loads、load的使用

本文主要讲下json.dumps和json.dump、json.loads和json.load的区别,因为经常需要加载json文件,读取数据,傻傻分不清...

9110
来自专栏数据结构与算法

17:文字排版

17:文字排版 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述 给一段英文短文,单词之间以空格分隔(每个单词包括其前后紧邻...

32170
来自专栏后端技术探索

(答案来了)两道腾讯面试题目

前天推送的文章《两道腾讯技术面试题(二面经历)》,收到了不少留言,感兴趣的可以去哪篇文章下查看精选留言,有一多半同学没有正确理解题目,可分享的留言寥寥无几,根据...

12310
来自专栏desperate633

LintCode 哈希函数题目代码

在数据结构中,哈希函数是用来将一个字符串(或任何其他类型)转化为小于哈希表大小且大于等于零的整数。一个好的哈希函数可以尽可能少地产生冲突。一种广泛使用的哈希函数...

11040
来自专栏数说工作室

【SAS Says】基础篇:描述性分析(下)

好吧,这一节是留给处女座的,主要说如何用proc tabulate和proc report产生一个更加耐看的报告。有时候print、means和freq产生的报...

67750
来自专栏从流域到海域

Python reduce()函数

MapReduce: Simplified Data Processing on Large Clusters Jeffrey Dean and Sanj...

21890
来自专栏数据结构与算法

2806 红与黑 个人博客:doubleq.win

个人博客:doubleq.win 2806 红与黑  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 白银 Silver 题解  查看运行结...

29740
来自专栏数据结构与算法

1226 倒水问题

1226 倒水问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有两个无刻...

29360

扫码关注云+社区

领取腾讯云代金券