《从头再来》剑指offer.59I 滑动窗口的最大值

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。

同样的借助双端队列来完成目标。双端队列用于保存当前窗口中的最大值,和最大值后边的比他小的值。如果移动窗口,则首先删除双端队列的队头元素,再添加元素。如果滑动窗口新添加的元素大于双端队列中现存的所有元素,则双端队列只保存这个最大的元素。

class Solution {
public:
    //必须定义一个类,重写函数才可以
    class MyQueue{
        public:
        deque<int>  deq;

        //入队--只入当前滑动窗口的最大值,以及后面的小值;如果滑窗移动,必须保证当前队列的头元素为滑窗最大值
        void push(int val){
            while(! deq.empty() && deq.back() < val)    deq.pop_back();
            deq.push_back(val);
        }

        //出队--如果队列的头元素等于出滑窗的元素,则删除队列头元素,否则不做任何操作
        void pop(int val){
            if(deq.front() == val)  deq.pop_front();
        }

        //取最大值
        int front(){
            return deq.front();
        }
    };
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {

        //一定要创建对象
        MyQueue deq;
        vector<int> result;

        if(nums.empty())    return result;
        //先将前k个元素入队
        for(int i = 0; i < k; ++i){
            deq.push(nums[i]);
        }
        result.push_back(deq.front());//取得第一个滑窗的最大值
        //滑窗移动
        for(int i = k; i < nums.size();++i){
            deq.pop(nums[i-k]);//删除
            deq.push(nums[i]);//增添
            result.push_back(deq.front());//滑窗动一次去一次最大值
        }
        return result;
    }
};

所有的解释都在代码里了,以上。

《从头再来》

posted @ 2021-06-05 20:33  丶原来是枝知啊i  阅读(56)  评论(0)    收藏  举报