给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。
例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};
思路:
初始化一个双向队列(滑动窗口) 队列头部放置该区间窗口最大值
每次到来一个新的值,
- 从队列末尾开始,将比该新值小的移出队列(因为这些值不可能成为区间最大值)
- 同时判断队列头部的最大值是否过期(即是否因为窗口滑动而过期,通过下标和区间大小判定)
同时这2步都是可能多次移除多个值
每次循环之后判断队列头部的最大值下标是否,大于区间长度,是移入结果中(即考虑一开始滑动窗口还没建立的情况)
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
vector<int> res;
deque<int> windows;
for(int i=0;i<num.size();i++)
{
while(windows.size() && num[windows.back()]<num[i])
windows.pop_back();
while(windows.size() && i-windows.front()+1>size)
windows.pop_front();
windows.push_back(i);
if(size && i+1>=size)
res.push_back(num[windows.front()]);
}
return res;
}
};