队列的最大值

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

若队列为空,pop_frontmax_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() {
}


//maxIndex头节点就是当前的
public int max_value() {
if (queue.isEmpty()) {
return -1;
}
return maxIndex.peek();
}


// 记录更新每次的最大值,前面的小的,都出队,所以每次就保留了后面的最大值
// 实际上maxindex降序保留最大值
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 ;
}
}