【剑指offer】剑指 Offer 59 - II. 队列的最大值

剑指 Offer 59 - II. 队列的最大值

题目链接

在这里插入图片描述
剑指 Offer 59 - II. 队列的最大值

思路分析

  • 首先需要明确的是,我们的max_value是用来得到队列中的最大值的,所以我们max_value返回的一定是队头元素,那么如果我们新入队的数变为当前队列的最大值的话,我么就要更新最大值队列
  • 例如 入队顺序为2 3 5,那么当5入队后,其前面的2 3就没有意义了,因此需要将他们出队
  • 想要将他们出队,就一定要从尾部开始判断,因此我们需要尾删,所以也决定了我们要使用deque的数据结构
  • 当数据出队时,如果当前队头元素和我们存储最大值队列的队头元素相等时,此时两者都需要出队

代码实现

class MaxQueue {
public:
    queue<int> q;
    deque<int> d;
    MaxQueue() {

    }
    
    int max_value() {
        //如果想要最大值,那么我们就需要返回队头元素,因此我们需要保证我们的队头元素是最大的
        return d.empty() ? -1 : d.front();
    }
    
    void push_back(int value) {
        //对于q来说,我们对value正常插入,对于特殊的d来说,如果当前值是队列最大值,那么之前的所有值都没有意义,需要出队
        while(!d.empty() && d.back() < value)
            d.pop_back();
        q.push(value);
        d.push_back(value);
    }
    
    int pop_front() {
        //q正常出队,对于d来说,如果出队元素和此时d的队头元素相等的话,就出队
        if(q.empty())
            return -1;
        int val = q.front();
        if(val == d.front())
            d.pop_front();
        q.pop();
        return val;
    }
};

/**
 * Your MaxQueue object will be instantiated and called as such:
 * MaxQueue* obj = new MaxQueue();
 * int param_1 = obj->max_value();
 * obj->push_back(value);
 * int param_3 = obj->pop_front();
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值