滑动窗口的最大值

**

滑动窗口的最大值

**
在这里插入图片描述
题目出处https://www.acwing.com/problem/content/75/
题目意思:[2,3,4,2,6,2,5,1] k=3,存在6个滑动窗口,
分别为[2,3,4],[3,4,2],[4,2,6],[2,6,2],[6,2,5],[2,5,1]
每个滑动窗口的最大值为[4,4,6,6,6,5]

方法二:暴力[方法不佳,代码略],将所有长度为k的滑动窗口全部扫描一遍。
时间复杂度O(m*n)

方法二:优化版暴力[方法不佳,代码略],将所有长度为k的滑动窗口全部扫描一遍,并用一个变量保存当前的最大值,每次读取下一个变量和判断滑动窗口的首个元素是否为最大值,若新读取的值大于最大值,更新最大值,若释放的首个元素为最大值,遍历一遍获取当前滑动窗口新的最大值。
时间复杂度O(n*m).但效率远大于方案一。

方案三:单调队列
先文字描述一下该方案。
1.若新入队的数大于等于队尾元素,一直释放队尾元素小于新入队数或队列为空为止。
2.若队列内的最大值已经离开滑动窗口,弹出该队列。
3.将队首元素添加至容器中。
例子:给定数组[2,3,4,2,6,2,5,1]
deque[存入下标](为直观显示,文档中显示该下标其对应的数):
Vector[存入滑动窗口最大值]:
当i=0时deque:2 vector:null[滑动窗口长度不足,不加入该数]
当i=1时deque:3 vector:null[3覆盖2]
当i=2时deque:4 vector:4[4覆盖3,加入4]
当i=3时deque:4 2 vector:4 4[队列入2,加入4]
当i=4时deque:6 vector:4 4 6[6覆盖4 2,加入6]
当i=5时deque:6 2 vector:4 4 6 6[队列入2,加入6]
当i=6时deque:6 5 vector:4 4 6 6 6[5覆盖2,加入6]
当i=7时deque:5 1 vector:4 4 6 6 6 5[队列入1,6的下标与1的下标差为3,弹出6,加入5]
时间复杂度O(n)

AC代码如下:

class Solution {
public:
    vector<int> maxInWindows(vector<int>& nums, int k) {
        size_t len = nums.size();
        vector<int>ver;
        deque<int>de;
        for(size_t last = 0;last<len;last++){
            while(!de.empty()&&nums[last]>=nums[de.back()])de.pop_back();
            de.push_back(last);
            if(last-de.front()>=k)de.pop_front();
            if(last>=k-1)ver.push_back(nums[de.front()]);
        }
        return ver;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值