剑指 Offer 30. 包含min函数的栈 - 力扣(LeetCode) (leetcode-cn.com)
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:

  1. MinStack minStack = new MinStack();
  2. minStack.push(-2);
  3. minStack.push(0);
  4. minStack.push(-3);
  5. minStack.min(); --> 返回 -3.
  6. minStack.pop();
  7. minStack.top(); --> 返回 0.
  8. minStack.min(); --> 返回 -2.

提示:

  1. 各函数的调用总次数不超过 20000 次

注意:本题与主站 155 题相同:https://leetcode-cn.com/problems/min-stack/

思路分析

注意: top那一步,这个视频有误 应为(返回栈A栈顶元素)

min.gif
【动画模拟】一下就能读懂的题解(辅助栈) - 包含min函数的栈 - 力扣(LeetCode)

我们来对视频进行解析

  1. 我们执行入栈操作时,先观察需要入栈的元素是否小于栈 B 的栈顶元素,如果小于则两个栈都执行入栈操作。
  2. 栈 B 的栈顶元素则是,栈 A 此时的最小值。则 getmin 只需返回栈 B 的栈顶元素即可。
  3. 出栈时,需要进行对比,若栈 A 和栈 B 栈顶元素相同,则同时出栈,此时 B 的栈顶保存的仍为此时栈 A 的最小元素。

    Python代码实现

    ```python class MinStack:

    def init(self):

    1. """
    2. initialize your data structure here.
    3. """
    4. self.nom_list = []
    5. self.min_list = []

    def push(self, x: int) -> None:

    1. self.nom_list.append(x)
    2. if self.min_list:
    3. if x <= self.min_list[-1]:
    4. self.min_list.append(x)
    5. else:
    6. self.min_list.append(x)

    def pop(self) -> None:

    1. if self.nom_list[-1] == self.min_list[-1]:
    2. self.min_list.pop()
    3. self.nom_list.pop()

    def top(self) -> int:

    1. return self.nom_list[-1]

    def min(self) -> int:

    1. return self.min_list[-1]

Your MinStack object will be instantiated and called as such:

obj = MinStack()

obj.push(x)

obj.pop()

param_3 = obj.top()

param_4 = obj.min()

  1. ![16cf5681706a2f46333c0de8bf645a9.png](https://cdn.nlark.com/yuque/0/2021/png/23221561/1639971772809-6258383e-3695-4a48-bdcf-4ae59da0ce8e.png#clientId=u4c3432d7-cd8a-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u57a207ed&margin=%5Bobject%20Object%5D&name=16cf5681706a2f46333c0de8bf645a9.png&originHeight=852&originWidth=1440&originalType=binary&ratio=1&rotation=0&showTitle=false&size=122039&status=done&style=none&taskId=u16294688-132c-4241-9425-69daf3bdd3d&title=)
  2. <a name="zdnmh"></a>
  3. ### 一般的排序思路
  4. ```python
  5. class MinStack:
  6. def __init__(self):
  7. """
  8. initialize your data structure here.
  9. """
  10. self.list = []
  11. self.list_new = []
  12. def push(self, x: int) -> None:
  13. self.list.append(x)
  14. def pop(self) -> None:
  15. self.list.pop()
  16. def top(self) -> int:
  17. self.list_new = sorted(self.list)
  18. return self.list_new[-1]
  19. def min(self) -> int:
  20. self.list_new = sorted(self.list)
  21. print(self.list_new)
  22. return self.list_new[-1]
  23. # return self.list.min()
  24. # Your MinStack object will be instantiated and called as such:
  25. # obj = MinStack()
  26. # obj.push(x)
  27. # obj.pop()
  28. # param_3 = obj.top()
  29. # param_4 = obj.min()