题解 | 滑动窗口的最大值

滑动窗口的最大值

https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788

class Solution {
private:
    class Myqueue{
        private:
            deque<int> dq;
        public:
            void pop(){
                dq.pop_front();
            }
            void push(int num){
                if(dq.empty()) dq.push_back(num);
                else{
                    while(!dq.empty() && dq.back() < num){
                        dq.pop_back();
                    }
                    dq.push_back(num);

                }
            }
            int front(){
                return dq.front();
            }
    };
    Myqueue mq;
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num int整型vector 
     * @param size int整型 
     * @return int整型vector
     */
    vector<int> maxInWindows(vector<int>& num, int size) {
        if(size == 0 || size > num.size()) return {};
        int left = 0;
        int right = size - 1 ;

        for(int i = 0 ; i < size; i++){
            mq.push(num[i]);
        }
        vector<int> res;
        res.push_back(mq.front());
        while(right < num.size() - 1){
            cout<<right<<endl;

            if(mq.front() == num[left]){
                mq.pop();
                cout<<num[left]<<endl;
            }
            left++;
            right++;
            cout<<num[right]<<endl;
            mq.push(num[right]);
            cout<<mq.front()<<endl;
            res.push_back(mq.front());
        }
        return res;
    }
};

全部评论
单调队列思维: 需要使用双端队列,入队从队伍尾进,最大值在队首, 出队判定,和队首一样说明应该出队,否则说明出的是对首之前的值,不做处理 所以最好定义一个用双端队列定义一个单调队列再去做,这样最简单。最大值取队首,入队从队尾进,出队也从队首 不能用栈或者队列实现主要是,最值和入队的方向不同
点赞 回复 分享
发布于 2025-04-22 17:34 上海

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务