Sword59-II——队列的最大值
方法1——普通队列和双端队列
- 思路:使用普通队列保存基本元素,双端队列来保存队列的最大值
- 特殊情况与临界分析:无
- 终止条件:无
- 步骤:
- 定义两个队列,Queue和Deque
- 初始化两个队列
- 取最大值方法
- 双端队列非空,直接返回双端队列的队头元素
- 双端队列为空,返回-1
- 插入元素时
- 双端队列是否非空,且当前元素是否比双端队列的队尾元素要大
- 向普通队列添加元素,向双端队列尾部添加元素
- 删除元素时
- 判断普通队列是否为空,为空则返回-1
- 从普通队列中弹出队首元素
- 判断删除元素是否与双端队列的队首元素相同
- 返回删除的元素
class MaxQueue {
Queue<Integer> queue;
Deque<Integer> deque;
public MaxQueue() {
queue = new LinkedList<>();
deque = new LinkedList<>();
}
public int max_value() {
return deque.isEmpty() ? -1 : deque.peekFirst();
}
public void push_back(int value) {
while (!deque.isEmpty() && value > deque.peekLast()) {
deque.pollLast();
}
queue.offer(value);
deque.offerLast(value);
}
public int pop_front() {
if (queue.isEmpty()) {
return -1;
}
int res = queue.poll();
if (res == deque.peekFirst()) {
deque.pollFirst();
}
return res;
}
}
![方法1——普通队列和双端队列](https://i-blog.csdnimg.cn/blog_migrate/f1d49d475fcbca85b75489fc37b27aa1.png)