【劍指offer】59-2.隊列的最大值

題目描述

請定義一個隊列並實現函數 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;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章