【面試題59-Ⅱ 隊列的最大值】
面試題59-Ⅱ:隊列的最大值:請定義一個隊列並實現函數 max_value 得到隊列裏的最大值,要求函數max_value、push_back 和 pop_front 的均攤時間複雜度都是O(1)。若隊列爲空,pop_front 和 max_value 需要返回 -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()
單調棧相關題目:類型題Ⅰ:單調棧