代码随想录:滑动窗口最大值

代码随想录:滑动窗口最大值

用双端队列写一个单调队列

class Solution {
public:
    class biggerqueue {
    public:
        deque<int> target;

        // int windows_size;
        // biggerqueue(int size) { windows_size = size; }
        //全错了,不能用size来pop掉首元素,因为push的时候会去掉末尾比目标元素小的元素

        void pop(int value) {
            if(!target.empty()&&target.front()==value){
                target.pop_front();
            }
        }

        void push(int value) {
            if(value>target.front()){
                while(!target.empty()){
                    target.pop_back();
                }
                target.push_back(value);
            }else{
                while(value>target.back()){
                    target.pop_back();
                }
                target.push_back(value);
            }
        }

        int front() { return target.front(); }
    };

    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        biggerqueue q;
        vector<int> res;
        for (int i = 0; i < k; i++) {
            q.push(nums[i]);
        }
        res.push_back(q.front());
        for (int i = k; i < nums.size(); i++) {
            q.pop(nums[i-k]);//如果上一个元素是最大的,push掉上一个元素
            q.push(nums[i]);
            res.push_back(q.front());
        }
        return res;
    }
};
posted @ 2024-12-16 21:19  huigugu  阅读(4)  评论(0编辑  收藏  举报