leetcode偶遇特殊数据结构——单调队列

单调队列

介绍

单调队列是一种特殊的数据结构。用来保持一个有序的队列。(无序的数据出队列)

通过适配 deque 而来。

API

template< class Type >
class monotonous_queue{
private:
    deque<Type> data; //或者使用queue
public:
    void push(Type); //尾部插入到单调队列中
    void pop(Type); //从头部离开单调队列
    Type max(); //返回单调队列中的最大元素
};

实现

template < class Type >
void monotonous_queue<Type>::push(Type n){
    while(!data.empty() && n > data.back()) //保持单调队列特性,尾部比输入小的数值全部舍弃
        data.pop_back();
    data.push_back(n);
    return;
}

template < class Type >
void monotonous_queue<Type>::pop(Type n){ 
    if(!data.empty() && data.front() == n) //有可能在pop之前,就因为push()中的步骤pop掉
        data.pop_front();
    return;
}

template < class Type >
Type monotonous_queue<Type>::max(){
    return data.front();
}

实际上单调队列这一种数据结构使用的是队列中的pop_back() push_back() pop_front() back() front() 方法,queue容器中不提供 pop_back() 方法,因此不可以通过适配 queue 而来。

Leetcode 239 滑动窗口最大值

难度:hard

链接:https://leetcode-cn.com/problems/sliding-window-maximum/

源码:

vector<int> maxSlidingWindow(vector<int>& nums, int k) {
    monotonous_queue<int> mq;
    vector<int> res;
    for(int i=0;i<nums.size();++i){
        if(i<k-1) //当前滑动窗口中的元素小于k个时,直接入队
            mq.push(nums[i]);
        else{ //入队后,输出窗口中的最大值给res,再弹出最前端为 nums[i-k+1] 的值,没有就不弹出
            mq.push(nums[i]);
            res.push_back(mq.max());
            mq.pop(nums[i-k+1]);
        }
    }
    return res;
} 

时间复杂度:O(N)

空间复杂度:O(k)

学习自labuladong

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值