(C++)剑指offer-64:滑动窗口是最大值(队列)

(C++)剑指offer-64:滑动窗口是最大值

通过双向单调队列实现,窗口向右滑动的过程相当于把窗口第一个数字删除,同时在窗口末尾添加一个新数字,双向队列deque可以实现,并且在队列中只保留那些可能成为窗口最大元素的数字,因此队列中进入一个较大的数字,便把该队列中比这个进入的数字小的全部弹出,通过双向单调队列,将元素的下标存储,假定双向队列的队头是整个队列的最大元素所在的下标,至队尾下标代表的元素数值依次减少,因此遍历整个数组时都要判断队头是否还能够留在队列中,如果队头下标距离遍历位置i超过k,就应该出队,并且通过num[i]弹出所有比其小的队列元素下标,保证队列的单调性,这样遍历完之后,每次队头即为每个滑动窗口的最大值的下标,时间复杂度为O(n),具体代码如下:

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, int size)
    {
        vector<int> res;
        deque<int> q;
        for(int i = 0; i < num.size(); i++){
            if(!q.empty() && q.front() <= i - size) //opps
                q.pop_front();
            while(!q.empty() && num[q.back()] < num[i])
                q.pop_back();
            q.push_back(i); //opps
            if(size != 0 && i >= size - 1)
                res.push_back(num[q.front()]);
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值