剑指 Offer 30. 包含min函数的栈 - 力扣(LeetCode) (leetcode-cn.com)
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
提示:
- 各函数的调用总次数不超过 20000 次
注意:本题与主站 155 题相同:https://leetcode-cn.com/problems/min-stack/
思路分析
注意: top那一步,这个视频有误 应为(返回栈A栈顶元素)
【动画模拟】一下就能读懂的题解(辅助栈) - 包含min函数的栈 - 力扣(LeetCode)
我们来对视频进行解析
- 我们执行入栈操作时,先观察需要入栈的元素是否小于栈 B 的栈顶元素,如果小于则两个栈都执行入栈操作。
- 栈 B 的栈顶元素则是,栈 A 此时的最小值。则 getmin 只需返回栈 B 的栈顶元素即可。
出栈时,需要进行对比,若栈 A 和栈 B 栈顶元素相同,则同时出栈,此时 B 的栈顶保存的仍为此时栈 A 的最小元素。
Python代码实现
```python class MinStack:
def init(self):
"""
initialize your data structure here.
"""
self.nom_list = []
self.min_list = []
def push(self, x: int) -> None:
self.nom_list.append(x)
if self.min_list:
if x <= self.min_list[-1]:
self.min_list.append(x)
else:
self.min_list.append(x)
def pop(self) -> None:
if self.nom_list[-1] == self.min_list[-1]:
self.min_list.pop()
self.nom_list.pop()
def top(self) -> int:
return self.nom_list[-1]
def min(self) -> int:
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()
![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=)
<a name="zdnmh"></a>
### 一般的排序思路
```python
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.list = []
self.list_new = []
def push(self, x: int) -> None:
self.list.append(x)
def pop(self) -> None:
self.list.pop()
def top(self) -> int:
self.list_new = sorted(self.list)
return self.list_new[-1]
def min(self) -> int:
self.list_new = sorted(self.list)
print(self.list_new)
return self.list_new[-1]
# return self.list.min()
# 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()