leetcode239.滑动窗口最大值

解析参考:
https://blog.csdn.net/u010429424/article/details/73692248

代码参考:
https://leetcode.com/problems/sliding-window-maximum/discuss/65956/My-C%2B%2B-O(n)-deque-based-solution-with-explanation

用单调队列做(从队头到队尾递减,队头为最大值)
队列存放下标,用于判断队首元素是否在窗口之外
步骤如下:
1.如果队列非空,则将元素入队列,并保证队列递减(在此过程中需要pop出比它小的元素)
2.入队列后判断队首元素如果在窗口之外,则移除队首元素
3.从第k-1个位置开始记录队首元素(k-1之前窗口还没满)

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3,依次如队列时,队列变化如下:
1
3
3,-1              
3,-1,-3
5
5,3
6
7
最大值依次为3,355,67(从第三行开始的队头元素)
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        deque<int> buffer;
        vector<int> res;

        for(auto i=0; i<nums.size();++i)
        {
            while(!buffer.empty() && nums[i]>=nums[buffer.back()]) buffer.pop_back(); //将比要加入元素小的元素都移除,保证队列从头到尾递减
            buffer.push_back(i); //把元素加入队尾

            if(i>=k-1) res.push_back(nums[buffer.front()]); //从第k-1开始记录答案
            if(buffer.front()<= i-k + 1) buffer.pop_front(); //如果队首元素超出窗口,则移除。窗口尾的位置是i,窗口大小为k,则窗口头位置是i-k+1,而如果当前队头=i-k+1时,下一轮循环时队头就超出窗口了,因此在这里移除
        } 
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值