155. 最小栈
设计一个支持 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.
提示:
pop、top 和 getMin 操作总是在 非空栈 上调用。
我的解答
一种很直接的想法:用数据构建栈stack
。在求栈的最小值时,建一个辅助数据temp_stack
。遍历stack
,即逐个弹出stack
中的元素,同是压入temp_stack
,记录最小值
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack=[]
def push(self, x: int) -> None:
self.stack.append(x)
def pop(self) -> None:
self.stack.pop(-1)
def top(self) -> int:
if len(self.stack)>0:
return self.stack[-1]
else:
return
def getMin(self) -> int:
if not len(self.stack):
return
temp_stack=[]
temp = self.top()
# print(temp)
while self.stack:
# print(self.top())
if self.top()<temp:
temp = self.top()
temp_stack.append(self.top())
self.pop()
while len(temp_stack)>0:
self.push(temp_stack.pop(-1))
return temp
大神解答
- 用数组实现栈
- 在初始化时,建立两个栈stack与min_stack.
- stack用于常规的push、pop、top。min_stack用于取最小值
- 每次在stack压入一个数据的时候,在min_stack中也压入一个数据。
- minstack在压入数据时有条件:如果待压入的数据比min_stack小,则将这个数压入min_stack,否则,压入当前min_stack的栈顶的数据。
第五步确保minstack与stack内的数据量相同。 - 在弹出时,min_stack也弹出
class MinStack(object):
def __init__(self):
self.stack = []
self.min_stack = []
def push(self, x):
"""
:type x: int
:rtype: void
"""
self.stack.append(x)
if self.min_stack:
if self.min_stack[-1] >= x:
self.min_stack.append(x)
else:
self.min_stack.append(self.min_stack[-1])
else:
self.min_stack.append(x)
return
def pop(self):
"""
:rtype: void
"""
if self.stack:
self.min_stack.pop()
return self.stack.pop()
def top(self):
"""
:rtype: int
"""
if self.stack:
return self.stack[-1]
def getMin(self):
"""
:rtype: int
"""
if self.min_stack:
return self.min_stack[-1]