一:priority_queue,使用k个元素的大顶堆,来组成滑动窗口。保持大顶堆的最大元素在滑动窗口内
class Solution {
public:
bool cmp(pair<int,int> p, pair<int,int> q){
return p.first>q.first;
}
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n=nums.size();
vector<int>res;
if(n==0)
return res;
if(n==1){
if(k>n)
return res;
else
return {nums[0]};
}
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<n;i++){
q.push({nums[i], i});
int index=q.top().second;
while(index<=i-k){
q.pop();
index=q.top().second;
}
res.push_back(q.top().first);
}
return res;
}
};
二:deque,保持队首是滑动窗口的最大值,保持队列中的元素大小为从大到小,但也得要保证队首元素在滑动窗口内,不在的话pop
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n=nums.size();
vector<int>res;
if(n==0)
return res;
if(n==1){
if(k>n)
return res;
else
return {nums[0]};
}
deque<int> q;
for(int i=0;i<k;i++){
while(q.size()&& nums[q.back()]<nums[i])
q.pop_back();
q.push_back(i);
}
res.push_back(nums[q.front()]);
for(int i=k;i<n;i++){
while(q.size()&& nums[q.back()]<nums[i])
q.pop_back();
q.push_back(i);
if(q.front()<=i-k)
q.pop_front();
res.push_back(nums[q.front()]);
}
return res;
}
};