力扣 - 剑指 Offer 59 - II. 队列的最大值
题目
思路1(单调队列)
- 和剑指 Offer 59 - I. 滑动窗口的最大值基本一样,我们使用两个队列来解决问题:一个普通的队列,用于正常的队列操作;一个双端队列,这个队列是用来存储队列中的最大值的
代码
class MaxQueue {
Deque<Integer> deque;
Queue<Integer> queue;
public MaxQueue() {
deque = new LinkedList<>();
queue = new LinkedList<>();
}
public int max_value() {
// 双端队列的队首就是当前队列的最大值
if (deque.isEmpty()) {
return -1;
} else {
return deque.peekFirst();
}
}
public void push_back(int value) {
// 首先要先正常添加到普通队列中
queue.offer(value);
// 然后将value和双端队列的末尾元素进行比较,不断吧小雨value的值删除掉,然后找到第一个小于队尾元素的位置插入进去,如果没有就直接插入
while (!deque.isEmpty() && deque.peekLast() < value) {
deque.pollLast();
}
deque.offerLast(value);
}
public int pop_front() {
if (queue.isEmpty()) {
return -1;
} else {
// 弹出队列头的元素
int value = queue.poll();
// 弹出的时候还要比较该元素是不是队列中的最大值,如果是的话,就将它从双端队列中删除,然后第二大的元素成为队头(即此时队列中的最大值)
if (value == deque.peekFirst()) {
deque.pollFirst();
}
return value;
}
}
}
复杂度分析
- 时间复杂度:\(O(1)\),插入、删除、获取最大值只需要\(O(1)\)时间复杂度即可
- 空间复杂度:\(O(N)\),存储队列需要用到的空间
我走得很慢,但我从不后退!

浙公网安备 33010602011771号