思路:使用一个普通队列,一个辅助队列(单调非递减队列),辅助队列 deque的队首元素就是队列的最大值。
class MaxQueue {
Deque<Integer> deque;
Queue<Integer> queue;
public MaxQueue() {
deque = new LinkedList<>();
queue = new LinkedList<>();
}
public int max_value() {
// 如果辅助队列为空返回-1,否则返回辅助队列的队首元素
return deque.isEmpty() ? -1 : deque.peekFirst();
}
public void push_back(int value) {
queue.offer(value);
// 维持单调队列
// 队列非空且队首元素小于要进来的value,则队尾不断出队
while(!deque.isEmpty() && deque.peekLast() < value){
deque.pollLast();
}
// value入队
deque.offerLast(value);
}
public int pop_front() {
if(queue.isEmpty()) return -1;
// 如果出队的元素queue.peek()是最大元素deque.peekFirst(),则 双向队列 需要同时 将首元素出队
// queue 里面保存的是 Integer 而非 int ,peek() 返回的是 Integer 类型,没有自动拆箱,因此需要用 equals() 来比~
// 大于127的Integer对象要用equals()比较,不能用==
if(queue.peek().equals(deque.peekFirst())){
deque.pollFirst();
}
return queue.poll();
}
}