剑指 Offer 59 - II. 队列的最大值
题目中要求 O(1) 的时间复杂度。那么,就需要通过提高空间复杂度来进行置换。
构建:
- 一个普通队列
- 一个存放最大值队列
的想法,在有元素弹出操作的情况下会造成,无法得到队列中最大值的情况。
因此,改进的方法是:
- 在存入最大值时,要检查队列中所有元素是不是都小于当前的最大值。
- 在弹出元素时,只有在元素和最大值相等时,才弹出最大值
![d84d2478f6476969b09824ad214d28a6.gif](https://img-blog.csdnimg.cn/img_convert/d84d2478f6476969b09824ad214d28a6.gif)
答案
class MaxQueue: def __init__(self): self.A = [] self.B = [] def max_value(self) -> int: if self.B: return self.B[0] return -1 def push_back(self, value: int) -> None: self.A.append(value) # 在存入最大值时,要检查队列中所有元素是不是都小于当前的最大值。 while self.B and value > self.B[-1]: self.B.pop() self.B.append(value) def pop_front(self) -> int: if self.B and self.A: if self.A[0] == self.B[0]: self.B.pop(0) return self.A.pop(0) return -1# 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()