思路1:维护优先队列prioprity_queue<int,int>pq记录数组值和下标,push以后不断地判断队头是否下标在滑动窗口范围内,若不是出队,否则即为当前最大值。
思路2:维护双端队列deque<int>dq记录数据下标,维护一个单调递减的队列,每次判断队头下标是否在范围内,若不是pop_front,否则为当前最大值
思路二
代码
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n = nums.size();
deque<int>q;
vector<int>ans;
for(int i=0;i<k;i++){
while(!q.empty()&&nums[i]>=nums[q.back()]){
q.pop_back();
}
q.push_back(i);
}
ans.push_back(nums[q.front()]);
for(int i=k;i<n;i++){
while(!q.empty()&&nums[i]>=nums[q.back()]){
q.pop_back();
}
q.push_back(i);
while(q.front()<=i-k){
q.pop_front();
}
ans.push_back(nums[q.front()]);
}
return ans;
}
};
单调队列作用:
区间最小(最大)值问题。
单调栈的作用
以O(n)时间复杂度求出某个数的左边或右边第一个比它大或小的元素。