求滑动窗口内的最大值,单调队列做法
LeetCode 239. 滑动窗口最大值 - AcWing
class Solution {
public:
//https://www.bilibili.com/video/BV1XS4y1p7qj/?spm_id_from=333.337.search-card.all.click
//检查删除的元素是不是最大的,如果是则删除队首元素,选择判断即可
void pop_my(int val,deque<int>&nums){
if(!nums.empty()&&val==nums.front())
nums.pop_front();
}
//检查插入的元素是不是大于队尾的元素,删除小于所插入元素的所有队列元素,
//所求是最大值,当前插入的元素如果比队尾的元素大,而当前元素又是后来插入队列的
//一定比队列中已有的元素留存的时间要更长(一定在当前队列所有元素都删除了才可能删除插入的这个元素),因此,只要队列
//中小于插入的元素,就删除,直到队列中的数都满足比插入的数大
void push_my(int val,deque<int>&nums){
while(!nums.empty()&&val>nums.back())
nums.pop_back();
nums.push_back(val);
}
//根据上述规则,队首存储的是最大的元素,记为所求,返回队首元素即可
int getMaxValue(deque<int>nums){
return nums.front();
}
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n=nums.size();//获取数组长度
vector<int> ans;
deque<int> dq;
for(int i = 0;i < k;i++)push_my(nums[i],dq);
ans.push_back(dq.front());
for(int i = k;i < n;i++){
pop_my(nums[i-k],dq);
push_my(nums[i],dq);
ans.push_back(dq.front());
}
return ans;
}
};
本地测试,测试样例
4
-7 -8 7 5 7 1 6 0 EOF
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
void pop_my(int val,deque<int>&nums){
if(!nums.empty()&&val==nums.front())//此处需要使用if
nums.pop_front();
}
void push_my(int val,deque<int>&nums){
while(!nums.empty()&&val>nums.back())//此处需要使用while
nums.pop_back();
nums.push_back(val);
}
int getMaxValue(deque<int>nums){
return nums.front();
}
//4
//-7 -8 7 5 7 1 6 0 EOF
int main() {
vector<int> nums;
int k;
cin>>k;
int n;
while(cin>>n)nums.push_back(n);
n=nums.size();//获取数组长度
vector<int> ans;
deque<int> dq;
for(int i = 0;i < k;i++)push_my(nums[i],dq);
ans.push_back(dq.front());
for(int i = k;i < n;i++){
pop_my(nums[i-k],dq);
push_my(nums[i],dq);
ans.push_back(dq.front());
for(int ii = 0;ii < dq.size();ii++)cout<<dq[ii]<<" ";
cout<<endl;
}
for(int i = 0;i < ans.size();i++)cout<<ans[i]<<" ";
return 0;
}