Leetcode 239. 滑动窗口最大值 优先队列 / 双向单调队列
原题链接:Leetcode 239. 滑动窗口最大值
1. 优先队列存放当前窗口的最大值
class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> res;priority_queue<pair<int,int>> q;for(int i=0;i<k;i++){q.push({nums[i],i});}res.push_back(q.top().first);for(int i=k;i<nums.size();i++){q.push({nums[i],i});while(q.top().second<=i-k){q.pop();}res.push_back(q.top().first);}return res;}
};
- 双向单调非递增队列
**核心思想:**每次遍历到一个新值时,删除队列中所有比这个值小的值,因为这个值入队之后,所以比这个值小的,并且在这个值之前的,都不可能是答案
参考:239. 滑动窗口最大值(单调队列,清晰图解)
class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> res;// 双向队列,单调非递减deque<int> q;int r=0,l=1-k;while(r<nums.size()){if(l>0 && q.front()==nums[l-1]){q.pop_front();}while(!q.empty() && nums[r]>q.back()){q.pop_back();}q.push_back(nums[r]);if(l>=0 ) res.push_back(q.front());r++;l++;}return res;}
};