解析参考:
https://blog.csdn.net/u010429424/article/details/73692248
用单调队列做(从队头到队尾递减,队头为最大值)
队列存放下标,用于判断队首元素是否在窗口之外
步骤如下:
1.如果队列非空,则将元素入队列,并保证队列递减(在此过程中需要pop出比它小的元素)
2.入队列后判断队首元素如果在窗口之外,则移除队首元素
3.从第k-1个位置开始记录队首元素(k-1之前窗口还没满)
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3,依次如队列时,队列变化如下:
1
3
3,-1
3,-1,-3
5
5,3
6
7
最大值依次为3,3,5,5,6,7(从第三行开始的队头元素)
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> buffer;
vector<int> res;
for(auto i=0; i<nums.size();++i)
{
while(!buffer.empty() && nums[i]>=nums[buffer.back()]) buffer.pop_back(); //将比要加入元素小的元素都移除,保证队列从头到尾递减
buffer.push_back(i); //把元素加入队尾
if(i>=k-1) res.push_back(nums[buffer.front()]); //从第k-1开始记录答案
if(buffer.front()<= i-k + 1) buffer.pop_front(); //如果队首元素超出窗口,则移除。窗口尾的位置是i,窗口大小为k,则窗口头位置是i-k+1,而如果当前队头=i-k+1时,下一轮循环时队头就超出窗口了,因此在这里移除
}
return res;
}
};