题目描述
请定义一个队列并实现函数 maxvalue 得到队列里的最大值,要求函数maxvalue、pushback 和 popfront 的 均摊 时间复杂度都是O(1)。
若队列为空,popfront 和 maxvalue 需要返回 -1
示例 1:
plaintext
1 | 输入: |
示例 2:
plaintext
1 | 输入: |
限制:
- 1<=pushback,popfront,maxvalue的总操作数<=10000
- 1<=value<=105
算法
(队列) O(n)
使用两个队列,一个普通队列 q 用来存储元素,一个双端队列用来维护队列 q 中的最大值。
push_back(value)
: 如果 maxq 的最大值小于当前值 val,则一直弹出队尾,然后将当前值压入队列 q 和 maxq 中。pop_front()
: 弹出队列 q 的队头并返回,同时如果队头正好是 maxq 的队头,则 maxq 也要弹出队头。max_value()
: 返回 maxq 的队头即可,队头就是最大值。
时间复杂度
O(n)
空间复杂度
O(n)
C++ 代码
cpp
1 | class MaxQueue { |