题目

题解

1. 优先队列

使用大根堆,大根堆的堆顶元素就是最大值,此时我们只需要维护k个元素的大根堆即可,当超过k个,就弹出最左边的元素

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        priority_queue<pair<int,int>>q;
        for(int i=0;i<k;i++){
        q.emplace(nums[i],i);
       }
        vector<int> ans={q.top().first};
        for(int i=k;i<nums.size();++i){
            q.emplace(nums[i],i);
        while(q.top().second<=i-k){
            q.pop();
        }
        ans.push_back(q.top().first);
       }
        return ans;
    }
};

2. 单调队列

使用单调队列,将最大值保留在队列中

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int q[100010];
        int hh=0,tt=-1;
        vector<int>ans;
        for(int i=0;i<k;i++){
            while(hh<=tt&&nums[i]>=nums[q[tt]])tt--;
            q[++tt]=i;
        }
        ans.push_back(nums[q[hh]]);
        for(int i=k;i<nums.size();i++){
            while(hh<=tt&&nums[i]>=nums[q[tt]])tt--;
            q[++tt]=i;
            while(q[hh]<=i-k){
                hh++;
            }
            ans.push_back(nums[q[hh]]);
        }
        return ans;
    }
};