题目来源:https://leetcode.cn/problems/sliding-window-maximum/
C++题解:用暴力解法会超时。下面题解参照代码随想录
为了使队列窗口能快速找对最大值,自定义一个单调队列,队首为最大值,每次push进去的元素值都比队列尾部的值小,如果比队列尾部的值大,就把队列尾部的值pop出来,直到队列尾部值比新值大或者队列为空,这样可以保证在窗宽(不是队列长度)范围内,队首为最大值。
再把前k个元素生成队列,然后开始步进,pop一个,push一个。由于队列并不完全等于窗宽,所以pop的时候需要判断,队首元素是否与窗宽步进抛弃的元素相同,同则pop,不同则说明队首元素还在窗内,不需要pop。
上面窗是指原数组的k个值,队列长度≤k,因为队列只在队首保留最大值。
class Solution {
private:
class Maxque{
public:
deque<int> que;
Maxque(){
}
void push(int x){
while(!que.empty() && x > que.back()) {
que.pop_back();
}
que.push_back(x);
}
void pop(int value){
if(que.front() == value) {
que.pop_front();
}
}
int front(){
return que.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int len = nums.size();
Maxque myque;
for(int ii = 0; ii < k; ii++){
myque.push(nums[ii]);
}
vector<int> res(0);
for(int jj = k; jj <= len; jj++) {
res.push_back(myque.front());
myque.pop(nums[jj-k]);
if(jj < len) myque.push(nums[jj]);
}
return res;
}
};