2022-7-12 剑指offer-队列-单调栈

剑指 Offer 59 - II. 队列的最大值

难度中等

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

若队列为空,pop_front 和 max_value 需要返回 -1

 1 class MaxQueue {
 2     PriorityQueue<Integer> max;
 3     LinkedList<Integer> queue;
 4     public MaxQueue() {
 5         queue=new LinkedList<>();
 6         max=new PriorityQueue<>((a,b)->(b-a));
 7     }
 8     
 9     public int max_value() {
10         if (max.isEmpty()) return -1;
11         return max.peek();
12     }
13     
14     public void push_back(int value) {
15         queue.offer(value);
16         max.offer(value);
17     }
18     
19     public int pop_front() {
20         if (queue.isEmpty()) return -1;
21         int x=queue.poll();
22         max.remove(x);
23         return x;
24     }
25 }
26 
27 /**
28  * Your MaxQueue object will be instantiated and called as such:
29  * MaxQueue obj = new MaxQueue();
30  * int param_1 = obj.max_value();
31  * obj.push_back(value);
32  * int param_3 = obj.pop_front();
33  */

最优解:用一个单调栈维护最大值,需要注意的是单调栈是递减的单调栈,需要把所有比当前数字小的全部出栈。

posted on 2022-07-12 20:22  阿ming  阅读(16)  评论(0编辑  收藏  举报

导航