【LeetCode 239】Sliding Window Maximum
2015-07-18 15:03
417 查看
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
题意:
给定一个数组序列,以及一个固定大小的窗口K,用k从前到后扫描一次数组,返回窗口每个状态下的最大值。
思路:
使用双端队列deque当做滑动窗口,保证每个状态下最大值总是在队首。比如[1,3,-1,-3,5,3,6,7],那么deque的状态分别为[1] 、[3] (前2步,填装滑动窗口) ,(从第三步正式开始)[3,-1]、 [3,-1,-3]、[5]、[5,3]、[6]、[7],可以看到每次队列的队首元素都是当前滑动窗口的最大值,具体过程可参考代码,有注释。时间复杂度O(n)。
C++:
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].
题意:
给定一个数组序列,以及一个固定大小的窗口K,用k从前到后扫描一次数组,返回窗口每个状态下的最大值。
思路:
使用双端队列deque当做滑动窗口,保证每个状态下最大值总是在队首。比如[1,3,-1,-3,5,3,6,7],那么deque的状态分别为[1] 、[3] (前2步,填装滑动窗口) ,(从第三步正式开始)[3,-1]、 [3,-1,-3]、[5]、[5,3]、[6]、[7],可以看到每次队列的队首元素都是当前滑动窗口的最大值,具体过程可参考代码,有注释。时间复杂度O(n)。
C++:
class Solution { public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { vector<int> ret; if(nums.size() == 0) return ret; //双端队列,存储的是元素的下标,不是元素的值 deque<int> slideWindow; for(int i = 0; i < k; i++) { //如果要进队列的数比它前面的数字大,则将它前面的数字从后面删除,直到它前边的数字比它大或者队列为空 while(!slideWindow.empty() && nums[i] >= nums[slideWindow.back()]) { slideWindow.pop_back(); } //加入新元素到队列 slideWindow.push_back(i); } for(int i = k; i < nums.size(); i++) { //队首元素即为当前窗口最大值 ret.push_back(nums[slideWindow.front()]); //如果要进队列的数比它前面的数字大,则将它前面的数字从后面删除,直到它前边的数字比它大或者队列为空 while(!slideWindow.empty() && nums[i] >= nums[slideWindow.back()]) { slideWindow.pop_back(); } //如果当前队首的元素已经不在窗口内部,则将其从队列前边删除 if(!slideWindow.empty() && slideWindow.front() <= i - k) slideWindow.pop_front(); //加入新元素到队列 slideWindow.push_back(i); } //不要忘了最后一个窗口的结果 - - ret.push_back(nums[slideWindow.front()]); return ret; } };
相关文章推荐
- OC_属性
- C++单元测试入门指南-在eclipse上建立Google test
- 计算客第一场,初赛。
- hdu3308 线段树 区间合并
- 福利!15款优秀移动APP产品原型设计工具
- 搜狗输入法的分词算法
- (转)成员变量和局部变量有什么区别?
- 【算法学习笔记】75. 动态规划 棋盘型 期望计算 1390 畅畅的牙签盒(改)
- zendCoding
- 045.Primitive Transfer 函数的参数传递
- 046.Pointer Transfer 指针类型的参数传递
- OpenCV(C++接口)学习笔记1-图像读取、显示、保存
- 3527: [Zjoi2014]力
- CALayer(Transform)旋转后产生锯齿
- [LeetCode][Java] Search in Rotated Sorted Array II
- LeetCode 234 Palindrome Linked List
- 044.Function Declare 函数的声明
- C++ 11个注意要点
- About iw
- 043.Return Type 函数的返回值