https://leetcode.com/problems/sliding-window-maximum/
http://blog.csdn.net/x_shuck/article/details/51458504
维护一个双向队列,从大到小,deq[0]为队列中的最大值。
每加入一个数:从末尾开始遍历,把比该数小的数都pop掉。
进行n-k+1次循环,
首先判断deq[0]是否已经不在窗口内,不在则pop;
再加入新的数。
为什么用if就可以,不需要用while。
代码来自该博客:
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int len = nums.size();
if (len == 0)
return vector<int>();
vector<int> res(len - k+1);
deque<int> mydeque(1, 0);//队列里存储的是数组的下标
for (int i = 1; i < k; i++){
for (int j = mydeque.size() - 1; j >= 0; j--){
if (nums[mydeque[j]] < nums[i]){
mydeque.pop_back();
}
}
mydeque.push_back(i);
}
res[0] = nums[mydeque[0]];
for (int i = k; i < len; i++){
if (mydeque[0] < i-k+1){
mydeque.pop_front();
}
for (int j = mydeque.size() - 1; j >= 0; j--){
if (nums[mydeque[j]] < nums[i]){
mydeque.pop_back();
}
}
mydeque.push_back(i);
res[i - k + 1] = nums[mydeque[0]];
}
return res;
}
};