1 题目描述
2 算法思路
思路:
- 首先思考,这个题目,为啥就和上一题是一个大题呢?
- 上一题就是,通过一个单调栈,每次将元素插入到栈中,保证栈的递减,确保了栈顶就是最大值
本题:
- 本题的本质,也是在插入和弹出操作之间,找最大值,和上一题的思路基本一致。
- 那么如今实现一个递减的队列呢
- 在每次插入元素时,都从尾部取出所有小于当前元素值的元素,再插入
- 确保了插入后依旧是递减的
- 同时也确保了,栈顶就是最大值
3 代码
class MaxQueue {
Queue<Integer> queue;
LinkedList<Integer> max;
public MaxQueue() {
queue = new LinkedList<>();
max = new LinkedList<>();
}
public int max_value() {
return max.size() == 0 ? -1 : max.getFirst();
}
public void push_back(int value) {
queue.add(value);
while(max.size() != 0 && max.getLast() < value)
max.removeLast();
max.add(value);
}
public int pop_front() {
if(max.size() != 0 && queue.peek().equals(max.getFirst()))
max.removeFirst();
return queue.size() == 0 ? -1 : queue.poll();
}
}
4 提交结果