【LeetCode】239. Sliding Window Maximum
2015-07-25 19:22
423 查看
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 =
Therefore, return the max sliding window as
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?
Hint:
How about using a data structure such as deque (double-ended queue)?
The queue size need not be the same as the window’s size.
Remove redundant elements and the queue should store only elements that need to be considered.
参考fentoyal的单调队列做法,我加上一些解释。
双端队列mq存放的是二元组,
第一元素表示当前值,
第二元素表示在队列中末尾值之后,在当前值之前并且小于当前值的个数。
mq的首个二元组的第一元素表示窗口范围内的最大值。
max函数:
返回首个二元组的第一元素
push函数:
为了保证max函数的作用,需要从末尾开始,把小于当前值的连续二元组出队列,但是需要累加上小于当前值的数目。
pop函数:
如果窗口在首个二元组之前还有元素,那么对队列影响就是首个二元组的计数减一。
否则代表首个二元组就是待出队的值,出队。
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?
Hint:
How about using a data structure such as deque (double-ended queue)?
The queue size need not be the same as the window’s size.
Remove redundant elements and the queue should store only elements that need to be considered.
参考fentoyal的单调队列做法,我加上一些解释。
双端队列mq存放的是二元组,
第一元素表示当前值,
第二元素表示在队列中末尾值之后,在当前值之前并且小于当前值的个数。
mq的首个二元组的第一元素表示窗口范围内的最大值。
max函数:
返回首个二元组的第一元素
push函数:
为了保证max函数的作用,需要从末尾开始,把小于当前值的连续二元组出队列,但是需要累加上小于当前值的数目。
pop函数:
如果窗口在首个二元组之前还有元素,那么对队列影响就是首个二元组的计数减一。
否则代表首个二元组就是待出队的值,出队。
class MonoQue { public: deque<pair<int, int> > q; int maxV() { return q.front().first; } void push(int n) { int count = 0; while(!q.empty() && q.back().first < n) { count += (q.back().second + 1); q.pop_back(); } q.push_back(make_pair(n, count)); } void pop() { if(q.front().second > 0) q.front().second --; else q.pop_front(); } }; class Solution { public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { vector<int> ret; if(k == 0) return ret; MonoQue mq; for(int i = 0; i < k; i ++) mq.push(nums[i]); for(int i = k; i < nums.size(); i ++) { ret.push_back(mq.maxV()); mq.pop(); mq.push(nums[i]); } ret.push_back(mq.maxV()); return ret; } };
相关文章推荐
- 数据类型运算符和变量
- 2015.07.25总结
- OC_路径寻找
- 股票学习(技术指标--个股贡献度)
- 图的深度遍历
- springMVC的前端控制器的配置
- Combination Sum III
- Android 限制只输入某些值包括数字、字母等
- 在PL/SQL中使用日期类型
- 车道检测数据集
- 特拉帕尼中文离线地图App上线
- OC_继承,便利构造器,初始化方法
- Android 解析AsyncTask(一)
- c# BackGroundWorker 多线程操作的小例子
- UVa 10570 - Meeting with Aliens(构造法)
- vps mark
- st3插件之emmet的强大
- HDU 1018.Big Number【7月25】
- Struts基础
- win7平台下vs2013配置opencv3.0