239 滑动窗口最大值

主要是学习怎么使用单调队列,在这道题中,我们需要队列能够很快的输出最大值;同时还需要删除窗口移动后的不在窗口内的元素
接下来的问题就是实现push,pop,front。
push:逻辑上来说,当接收到一个新元素时,应该把它插入到队列中,因此需要出队比它小的,插入后再重新入队。但实际上,因为我们只需要那些又可能成为最大值的元素,因此将比它小的元素删除后其实并不需要重新入队了。
pop:和上面相似,只有当我们要删除的元素等于最大值(也就是队列头时),才进行删除。否则就不需要操作,不删除也不会影响得到的结果;
front:直接返回队列头即可

class Solution {
public:
    class MyQuene
    {
        public:
        deque<int> que;

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

        void push( int value )
        {
		//从队尾不断删除比value小的值,然后入队value
            while( !que.empty() && value > que.back() )
                que.pop_back();
            
            que.push_back( value );
        }

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

    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        MyQuene que;
        vector<int> result;

        for(int i = 0; i < k; i++)
        {
            que.push( nums[i] );
        }

        result.push_back( que.front() );

        for( int i = k; i < nums.size(); i++)
        {
            que.pop( nums[ i-k ] );
            que.push( nums[ i ] );
            result.push_back(que.front() );
        }
        return result;

    }
};
posted @ 2025-03-04 21:22  名字好难想zzz  阅读(4)  评论(0)    收藏  举报