自学内容网 自学内容网

代码随想录 栈与队列 test 6

239. 滑动窗口最大值 - 力扣(LeetCode)

每次只取窗口中最大值,这个最大值可能在后面的滑动中保持不变,而比最大值小的值且在最大值之前出现的值没必要保留,因此可以通过单调队列利用这个特性。

这个单调队列具有如下性质:

1.队头始终为当前队列的最大值

2.队列具有单调性,队尾为最小值

因此,用三个函数实现题目要求。

pop(),检查当前滑动窗口最后一个元素是否为单调队列的队头,若不是则不用管,这说明该元素不是当前单调队列的最大值,在这之前就已经被丢出单调队列中。

push(),将当前滑动窗口的第一个元素加入单调队列中,把队列中小于该元素的值全部丢出队列。

getmax(),单调队列的队头即为最大值。

class Solution {
private:
    class MyQueue{
    public:
    deque<int> queue;
    
    void pop(int num){
        if(!queue.empty() && num == queue.front())
            queue.pop_front();
    }

    void push(int num){
        while(!queue.empty() && num > queue.back()){
            queue.pop_back();
        }
        queue.push_back(num);
    }

    int getMax(){
        return queue.front();
    }
    };
public:
    MyQueue queue;
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> res;
        
        for(int i = 0; i < k; i++){
            queue.push(nums[i]);
        }

        res.push_back(queue.getMax());

        for(int i = k; i < nums.size(); i++){
            queue.pop(nums[i - k]);
            queue.push(nums[i]);
            res.push_back(queue.getMax());
        }

        return res;
    }
};


原文地址:https://blog.csdn.net/m0_73941517/article/details/145328926

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!