【题目】
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
示例 1:
输入:
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]
示例 2:
输入:
["MaxQueue","pop_front","max_value"]
[[],[],[]]
输出: [null,-1,-1]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/dui-lie-de-zui-da-zhi-lcof
【思路】
维护一个递减队列,显示最大值直接返回队列头,出队时如果出的是最大值同步更新。
【代码】
class MaxQueue { Queue<Integer> que; Deque<Integer> deq; public MaxQueue() { que = new LinkedList<>(); deq = new LinkedList<>(); } public int max_value() { return deq.isEmpty()?-1:deq.peekFirst(); } public void push_back(int value) { que.offer(value); while(!deq.isEmpty()&&deq.peekLast()<value){ deq.removeLast(); } deq.addLast(value); } public int pop_front() { if(que.isEmpty()) return -1; // 如果出去的就是最大值,更新一下递减队列的情况 if(que.peek().equals(deq.peekFirst())){ deq.pollFirst(); } // 否则不用更新,因为中间值会在次大值出去之前就出去了,比如3 -1 -3 5 3 ,当出去5的时候,-1 和-3 早就出去了,只有后面的值会有影响。 return que.poll(); } }
标签:59,Offer,队列,max,最大值,back,value,II,deq From: https://www.cnblogs.com/End1ess/p/17354839.html