題目描述
請定義一個隊列並實現函數 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]
思路實現
class MaxQueue {
Queue<Integer> que;
Deque<Integer> deq;
public MaxQueue() {
que = new LinkedList<>(); //隊列:插入和刪除
deq = new LinkedList<>(); //雙端隊列:獲取最大值
}
public int max_value() {
return deq.size()>0?deq.peek():-1; //雙端隊列的隊首爲que的最大值
}
public void push_back(int value) {
que.offer(value); //value入隊
while(deq.size()>0 && deq.peekLast()<value){
deq.pollLast(); //將deq隊尾小於value的元素刪掉
}
deq.offerLast(value); //將value放在deq隊尾
}
public int pop_front() {
int tmp = que.size()>0?que.poll():-1; //獲得隊首元素
if(deq.size()>0 && deq.peek().equals(tmp)){
deq.poll(); //如果出隊的元素是當前最大值,將deq的隊首出隊
}
return tmp;
}
}