请定义一个队列并实现函数 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]
限制:
1 <= push_back,pop_front,max_value的总操作数 <= 10000
1 <= value <= 10^5
队列标记
每次标记上一次最大值的后面的最大值。
class MaxQueue {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| ArrayDeque<Integer> queue = new ArrayDeque<>(); ArrayDeque<Integer> maxIndex = new ArrayDeque<>(); public MaxQueue() { }
public int max_value() { if (queue.isEmpty()) { return -1; } return maxIndex.peek(); }
public void push_back(int value) { if (!queue.isEmpty()) { while (!maxIndex.isEmpty()&&maxIndex.getLast() <= value) { maxIndex.removeLast(); } } maxIndex.add(value); queue.add(value); }
public int pop_front() {
if (queue.isEmpty()) { return -1; }
Integer poll = queue.poll();
if (poll.equals(maxIndex.peek())) { maxIndex.poll(); } return poll ; } }
|