时间:2020-5-19
题目地址:https://leetcode-cn.com/problems/min-stack/description/
题目难度:Easy
题目描述:
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
示例:
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
思路1:使用队列的复制排序函数,后边才看到要求在常数时间内找到最小元素,我这肯定凉凉
代码段1:通过,但是不符合题意
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self._list = []
def push(self, x: int) -> None:
self._list.append(x)
def pop(self) -> None:
del self._list[-1]
def top(self) -> int:
return self._list[-1]
def getMin(self) -> int:
li = sorted(self._list)
return li[0]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
总结:
- 认真审题很重要
思路2:使用两个栈
一个栈去保存正常的入栈出栈的值,另一个栈去存最小值,也就是用栈顶保存当前所有元素的最小值。
代码段2:通过
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self._list = []
self._min_list = []
def push(self, x: int) -> None:
self._list.append(x)
if not self._min_list or x <= self._min_list[-1]:
self._min_list.append(x)
def pop(self) -> None:
if(self._list[-1] == self._min_list[-1]):
del self._min_list[-1]
del self._list[-1]
def top(self) -> int:
return self._list[-1]
def getMin(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.getMin()
总结:
- 时间复杂度:O(1),空间复杂度:O(N)
- 解法3:使用一个栈,同时存储最小值入栈;解法4:存储差值解决了「保存之前值」的问题;解法5:降维打击,改写数据结构,加入min属性