题目

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

思路

创建一个辅助栈,用于存储每次push后的最小值,同时在pop后更新辅助栈中的最小值。

代码

  1. class MinStack:
  2. def __init__(self):
  3. """
  4. initialize your data structure here.
  5. """
  6. self.stack = [] # 数据栈
  7. self.min_stack = [] # 不断把最小元素压入最小栈中
  8. def push(self, x: int) -> None:
  9. self.stack.append(x)
  10. if not self.min_stack or self.min_stack[-1] >= x:
  11. self.min_stack.append(x)
  12. def pop(self) -> None:
  13. if self.stack.pop() == self.min_stack[-1]:
  14. self.min_stack.pop()
  15. def top(self) -> int:
  16. return self.stack[-1]
  17. def min(self) -> int:
  18. return self.min_stack[-1]
  19. # Your MinStack object will be instantiated and called as such:
  20. # obj = MinStack()
  21. # obj.push(x)
  22. # obj.pop()
  23. # param_3 = obj.top()
  24. # param_4 = obj.min()

进一步优化,不用每次都把最小值入最小栈,只需要比较当前stack中的栈顶元素和最小值,如果大于最小值,则最小值所在的栈就不用出栈。

  1. class MinStack:
  2. def __init__(self):
  3. """
  4. initialize your data structure here.
  5. """
  6. self.stack = []
  7. self.stackMin = []
  8. def push(self, x: int) -> None:
  9. self.stack.append(x)
  10. if not self.stackMin or x <= self.stackMin[-1]:
  11. self.stackMin.append(x)
  12. def pop(self) -> None:
  13. if self.top() == self.stackMin[-1]:
  14. self.stackMin.pop()
  15. self.stack.pop()
  16. def top(self) -> int:
  17. return self.stack[-1]
  18. def min(self) -> int:
  19. return self.stackMin[-1]