滑动窗口思路
明确数据结构,双端队列【前后可弹出,后可入】,结果为数组
第一步 滑动窗口记录的最大值永远在队头,所以,在满足窗口大小后需要每次记录
第二步 明确队头弹出的两种情况
一种是超出窗口范围,从前端弹出
一种是后来的数比自身大。从后端弹出
第三步 队尾压入前需要做的是判断当前值是否需要弹出队尾再插入
(比队列存储索引对应的值大)
出现的值比现有队列存储索引对应的值大时,表示该值出现在滑窗中,部分值不会成为最大值,从队尾开始弹出
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
vector<int>max;
deque<int>downque; // 双端递减队列,存的是num的下标
for(int i=0;i<num.size();i++){
//出现的值比现有的值大时,表示该值出现在滑窗中,部分值不会成为最大值,从队尾开始弹出
while(!downque.empty()&&num[i]>num[downque.back()]){
downque.pop_back();
}
downque.push_back(i);
//队头不在窗口内需要弹出
if(i-downque.front()+1 >size) downque.pop_front();
//从size-1开始记录队头,即最大值
if(i >=size-1) max.push_back(num[downque.front()]);
}
return max;
}
};