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

简介: 剑指 Offer 59 - II:队列的最大值

题目

题目链接

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。

若队列为空,pop_front 和 max_value 需要返回 -1

示例 1:

输入: 
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]

示例 2:

输入: 
["MaxQueue","pop_front","max_value"]
[[],[],[]]
输出: [null,-1,-1]

解题

方法一:单调双向队列来辅助

参考链接

image.png


定义一个queue,为正常队列

定义一个deque,为辅助双向队列,通过它的队列头部来存储最大的值。

while(!deque.empty()&&value>deque.back()){
            deque.pop_back();
        }

上面这样子写,可以使得,相同的元素,重复加入,可以防止出现,queue不空,deque为空的情况。

综上,不会出现queue不为空,deque为空的情况

class MaxQueue {
public:
    queue<int> queue;
    deque<int> deque;
    MaxQueue() {
    }
    int max_value() {
        if(deque.empty()) return -1;//题目要求
        return deque.front();
    }
    void push_back(int value) {
      //当值大于deque尾的元素,就弹出
        while(!deque.empty()&&value>deque.back()){
            deque.pop_back();
        }
        deque.push_back(value);
        queue.push(value);
    }
    int pop_front() {
        if(deque.empty()) return -1;//题目要求
        int num=queue.front();
        if(deque.front()==num){//如果要弹出的元素和deque的头元素一致,就弹出。
            deque.pop_front();
        }
        queue.pop();
        return num;
    }
};


相关文章
|
4月前
剑指 Offer 59 - I:滑动窗口的最大值
剑指 Offer 59 - I:滑动窗口的最大值
22 0
|
4月前
剑指 Offer 43:1~n 整数中 1 出现的次数
剑指 Offer 43:1~n 整数中 1 出现的次数
31 0
|
4月前
剑指 Offer 40:最小的k个数(快速排序)
剑指 Offer 40:最小的k个数(快速排序)
19 0
|
4月前
剑指 Offer 45:把数组排成最小的数
剑指 Offer 45:把数组排成最小的数
16 0
|
4月前
剑指 Offer 09:用两个栈实现队列
剑指 Offer 09:用两个栈实现队列
17 1
|
5月前
「LeetCode」剑指 Offer 40. 最小的k个数
「LeetCode」剑指 Offer 40. 最小的k个数
29 0
|
5月前
leetcode 剑指 Offer 40. 最小的k个数
leetcode 剑指 Offer 40. 最小的k个数
19 0
|
5月前
|
C++ 索引
LeetCode239|剑指 Offer 59 - I. 滑动窗口的最大值
前言 看到滑动窗口以及示例,很容易被思维局限了,然后呢就开始打框架,用一个for循环,i-i+3这样的范围一直移动,但是每次都要比较这3个值的大小,如何比较呢?用类似之前T155的栈一样比较吧。但是存在一个问题,有些值就重复2-3次,似乎没有这个必要。
17 0
队列的最大值(剑指offer59-II)
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。 若队列为空,pop_front 和 max_value 需要返回 -1