Leetcode刷題:劍指offer【面試題59-Ⅱ 隊列的最大值】

【面試題59-Ⅱ 隊列的最大值】

面試題59-Ⅱ:隊列的最大值:請定義一個隊列並實現函數 max_value 得到隊列裏的最大值,要求函數max_value、push_back 和 pop_front 的均攤時間複雜度都是O(1)。若隊列爲空,pop_front 和 max_value 需要返回 -1。

思路:關鍵在於 O(1)O(1) 實現獲取隊列最大值,這種問題當然是使用單調棧了。維護一個雙端非嚴格單調遞減隊列,當待入隊元素大於當前隊尾元素時,將隊尾元素出隊,直到滿足的單調遞減性質爲止,這樣就能保證該輔助隊列的隊首元素總是當前最大值。在元素出隊時,判斷出隊元素和輔助隊列的隊首元素是否相同,若相同則同時出隊。

class MaxQueue:

    def __init__(self):
        self.queue = collections.deque()
        self.assist = collections.deque()   # 輔助隊列

    def max_value(self) -> int:
        if not self.assist:
            return -1
        # 非嚴格遞減雙端隊列
        return self.assist[0]

    def push_back(self, value: int) -> None:
        self.queue.append(value)
        # 非嚴格遞減雙端隊列
        while self.assist and self.assist[-1] < value:
            self.assist.pop()
        self.assist.append(value) 

    def pop_front(self) -> int:
        if not self.queue:
            return -1
        cur = self.queue.popleft()
        if cur == self.assist[0]:
            self.assist.popleft()
        return cur
        
# 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()

單調棧相關題目類型題Ⅰ:單調棧

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