题目描述
https://leetcode-cn.com/problems/min-stack/
思路题解
此题不是要让手动实现栈,而是要让我们用一种简单快捷的方式快速提取出当前栈内所有元素的最小值。有两种方法,分别为借用辅助栈的双栈法和保存差值的单栈法。
方法一:借用辅助栈的双栈法
新开辟一个辅助栈smin
,保存当前栈内的最小值。如果进行了pop
操作,则smin
内的元素也出栈。当有元素入栈时,即push
操作,则同步加入新入栈元素x
和辅助栈栈顶元素smin[-1]
的最小值到辅助栈中。
代码如下:
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack=[]
self.smin=[]
self.smin.append(float("inf"))
def push(self, x: int) -> None:
self.stack.append(x)
self.smin.append(min(x,self.smin[-1]))
def pop(self) -> None:
self.stack.pop()
self.smin.pop()
def top(self) -> int:
if self.stack:return self.stack[-1]
else:return []
def getMin(self) -> int:
if self.smin:return self.smin[-1]
else:return []
# 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()
方法二:保存差值的单栈法
方法一的解题方式比较简单,但是空间上需要重新开辟一个栈。看到力扣评论区有人说面试中有的面试官会问不借用辅助栈的做法,遂方法二则为不借用辅助栈的方法。
- diff:
diff=x-self.min_value
,保存新入栈的元素x
与在此之前的最小值min_value
的差 - self.stack:当有新元素入栈后,保存所计算的
diff
的大小。 - self.min_value:在进行任何的操作前,当前已有元素们的最小值。
下面以一个列子说明push操作的过程,假设先后入栈这几个元素:[-2,0,-3,-2]
在push时:
- 如果当前栈为空,则入栈的元素为0,且置
min_value=x
,因为此时栈内无元素,谁入栈谁就是最小值; - 当栈不为空时,入栈的是
x
与在此之前的最小值min_value
。
在pop时: - 若
diff<0
,则证明当前保存的最小值min_value
会发生变化,因为diff<0
意味着这个要出栈的节点x
是小于当时的min_value
的,所以在入栈时min_value
发生了更新,新的min_value
就是x
,栈内保存的是x
与前一个min_value
的差值。因此这里不仅要把min_value
返回,还要重新更新下min_value=top-diff
。 - 若
diff>0
,则证明push
时x
大于当时的min_value
,所以x
入栈后min_value
也没有更新,栈内保存的是x
与前一个min_value
的差值,因此直接返回min_value + diff
即可。
代码如下:
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
self.min_value = -1
def push(self, x: int) -> None:
if not self.stack:
self.stack.append(0)
self.min_value = x
else:
diff = x-self.min_value
self.stack.append(diff)
self.min_value = self.min_value if diff > 0 else x
def pop(self) -> None:
if self.stack:
diff = self.stack.pop()
if diff < 0:
top = self.min_value
self.min_value = top - diff
else:
top = self.min_value + diff
return top
def top(self) -> int:
return self.min_value if self.stack[-1] < 0 else self.stack[-1] + self.min_value
def getMin(self) -> int:
return self.min_value if self.stack else -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()