Leetcode 239. 滑动窗口最大值(困难) 单调队列解决滑动窗口最大值

239. 滑动窗口最大值(困难)

题目:

给你输入一个数组 nums 和一个正整数 k,有一个大小为 k 的窗口在 nums 上从左至右滑动,请你输出每次窗口中 k 个元素的最大值。

 

 

思路:

labuladong

使用单调队列。保障队列中头部最大,尾部最小。

在尾部放入元素时,将前方小于x的都从尾部退出。

这样最大值为队列头部元素。

当退出元素时,如果退出元素等于头部元素,则头部元素在前部出队列。

 

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        MonotonicQueue q;
        vector<int> ret;
        for(int i=0;i<nums.size();++i){
            //前k-1个元素直接压入
            if(i<k-1){
                q.push(nums[i]);
            }else{
                //从第k个元素开始比较获取窗口中最大值
                q.push(nums[i]);
                ret.push_back(q.get_max());
                //退出i-(k-1)元素即窗口第一个元素
                q.pop(nums[i-k+1]);
            }
        }
        return ret;
    }
    //单调递减队列
    class MonotonicQueue{
    public:
        //压入元素
        void push(int n){
            //所有小于n的都从尾部退出
            while(!l.empty()&&l.back()<n){
                l.pop_back();
            }
            l.push_back(n);
        }
        //出元素
        void pop(int n){
            //如果n等于头部元素,则压出元素
            if(l.front()==n){
                l.pop_front();
            }
        }
        //最大值为头部元素
        int get_max(){
            return l.front();
        }
        list<int> l;
    };
};

 

posted @ 2022-02-25 14:54  鸭子船长  阅读(53)  评论(0编辑  收藏  举报