题目链接:https://leetcode-cn.com/problems/sliding-window-maximum/
题目内容
碎碎念
双端队列+滑动窗口
在上述滑动窗口形成及移动的过程中,我们注意到元素是从窗口的右侧进入的,然后由于窗口大小是固定的,因此多余的元素是从窗口左侧移除的。 一端进入,另一端移除,这不就是队列的性质吗?所以,该题目可以借助队列来求解。
队列:单调不递增队列,例如3,3,1这样。
代码
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> q;
vector<int> max_num(nums.size()-k+1,0);
int right=0;
int index=0;
while(right<nums.size()){
//确保队首元素一定最大
while(!q.empty()&&q.back()<nums[right]){
q.pop_back();
}
q.push_back(nums[right]);
right++;
//窗口满足要求
if(right>=k){
// 最大值就是队首元素
max_num[index++]=q.front();
// 如果队首元素恰好是窗口左边缘元素,则出队
if(q.front()==nums[right-k]){
q.pop_front();
}
}
}
return max_num;
// int left=0,right=k;
// int max_num=nums[0];
// vector<int> maxNum;
// deque<int> q;
// while(right<=nums.size()){
// max_num=nums[left];
// for(int i=left;i<right;i++){
// max_num=max(max_num,nums[i]);
// }
// maxNum.push_back(max_num);
// right++;
// left++;
// }
// return maxNum;
}
};
参考链接
- https://leetcode-cn.com/problems/sliding-window-maximum/solution/dong-hua-yan-shi-dan-diao-dui-lie-239hua-hc5u/
- 滑动窗口算法基本原理与实践 - huansky - 博客园