239. 滑动窗口最大值

单调队列:

本题的目的是实现一个单调队列,递减或递增,该题为递减

需要实现单调队列的三个部分:

(1) 出列,如果对头元素为当前元素则出列(目的是配合窗口的长度,如果队列中的长度超过了窗口的长度,则表名对头元素为窗口外的元素,需要出列)

  (2)   入列,入列时首先应该将小于该元素的队尾元素全部去除,如果队尾中含有一个小于该元素的元素,则队列不再单调。

  (3)   获取队列中的最大,最小值:该题获取最大值,由于单调递减,直接返回对头元素即可。

// 单调队列的本质是维持一个单调递减的队列
class MyQueue{
public:
    deque<int> que;  // 使用deque实现单调队列
    /*元素出栈*/   // 当超过元素长度时,出列对头元素 
    void pop(int val){
        if(!que.empty()&&val==que.front()){
            que.pop_front();
        }
    }
    /*入栈*/
    void push(int val){
        // 从对列尾部开始查找,小于当前元素的值全部出栈
        while(!que.empty()&&val>que.back()){
            que.pop_back();
        }
        // 当前元素入列
        que.push_back(val);
    }
    /*获取队列元素中的最大值*/
    int get_max(){
        if(!que.empty()){
            return que.front();    // 对头即为最大值,将对头元素出列
        }
        return -1;
    }
};
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        MyQueue que;
        // 初始化队列元素
        for(int i=0;i<k;i++){
            que.push(nums[i]);
        }
        vector<int> ans;   // 结果集
        ans.emplace_back(que.get_max());   // 第一个k的最大值
        for(int i=k;i<nums.size();i++){
            // 将当前元素入列
            que.push(nums[i]);
            // 队首元素出列
            que.pop(nums[i-k]);
            // 获取队列中的最大值加入结果集
            ans.push_back(que.get_max());
        }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值