【劍指Offer系列59-2】隊列的最大值

題目

請定義一個隊列並實現函數 max_value 得到隊列裏的最大值,要求函數max_value、push_back 和 pop_front 的均攤時間複雜度都是O(1)。

若隊列爲空,pop_front 和 max_value 需要返回 -1。

代碼

Python

import queue

class MaxQueue:

    def __init__(self):
        self.deq=queue.deque() # 雙端隊列輔助,遞減,存儲極值
        self.que=queue.Queue() # 隊列
        
    def max_value(self) -> int:
        return self.deq[0] if self.deq else -1 # 雙端隊列隊頭值即最大值

    def push_back(self, value: int) -> None:
        while self.deq and self.deq[-1]<value: # 保持雙端隊列遞減
            self.deq.pop()
        self.deq.append(value)
        self.que.put(value)

    def pop_front(self) -> int:
        if not self.deq:
            return -1
        res=self.que.get()
        if res==self.deq[0]: # 同步刪除雙端隊列中的值
            self.deq.popleft()
        return res
        


# Your MaxQueue object will be instantiated and called as such:
# obj = MaxQueue()
# param_1 = obj.max_value()
# obj.push_back(value)
# param_3 = obj.pop_front()

C++

class MaxQueue {
    
    queue<int> que;
    deque<int> deq;
    
public:
    MaxQueue() {

    }
    
    int max_value() {
        if (deq.empty())
            return -1;
        return deq.front();
    }
    
    void push_back(int value) {
        while (!deq.empty() && deq.back()<value) {
            deq.pop_back();
        }
        deq.push_back(value);
        que.push(value);
    }
    
    int pop_front() {
        if (que.empty())
            return -1;
        int res=que.front();
        if (res==deq.front()) {
            deq.pop_front();
        }
        que.pop();
        return res;
    }
};

/**
 * Your MaxQueue object will be instantiated and called as such:
 * MaxQueue* obj = new MaxQueue();
 * int param_1 = obj->max_value();
 * obj->push_back(value);
 * int param_3 = obj->pop_front();
 */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章