返回
山穷水尽疑无路,柳暗花明又一村: 深度剖析 LeetCode 155. 取出最小栈
前端
2023-10-25 17:43:49
在计算机科学领域,栈是一种非常重要的数据结构,它遵循后进先出(Last-In-First-Out,简称 LIFO)原则,即后加入的元素总是第一个被移除。栈在现实世界中有许多应用,例如,浏览器的后退按钮就利用了栈的数据结构。
今天,我们将一起探究 LeetCode 155. 取出最小栈 这道经典题目。这道题目要求我们实现一个支持以下操作的栈:
push(x)
:将元素x
压入栈顶。pop()
:移除栈顶元素。top()
:获取栈顶元素。getMin()
:获取栈中最小元素。
实现最小栈最直观的想法是使用两个栈,一个栈用来存储元素,另一个栈用来存储最小元素。每当我们往元素栈压入一个元素时,我们也同时将这个元素压入最小栈。当我们从元素栈弹出元素时,我们也同时从最小栈中弹出元素。这样一来,最小栈始终存储着当前元素栈中的最小元素。
然而,使用两个栈会增加存储空间的开销。为了节省空间,我们可以使用一个辅助栈来存储最小元素。这个辅助栈只存储当前元素栈中所有元素的最小值。每当我们往元素栈压入一个元素时,我们首先检查辅助栈的栈顶元素是否大于或等于要压入的元素。如果是,我们直接将要压入的元素压入辅助栈。如果不是,我们先将辅助栈的栈顶元素弹出,然后将要压入的元素压入辅助栈。
这样一来,辅助栈始终存储着当前元素栈中所有元素的最小值。当我们从元素栈弹出元素时,我们同时从辅助栈弹出栈顶元素。这样一来,辅助栈始终保持着正确的最小值。
下面是使用辅助栈实现最小栈的代码示例:
class MinStack:
def __init__(self):
self.stack = []
self.min_stack = []
def push(self, x):
self.stack.append(x)
if not self.min_stack or x <= self.min_stack[-1]:
self.min_stack.append(x)
def pop(self):
if self.stack.pop() == self.min_stack[-1]:
self.min_stack.pop()
def top(self):
return self.stack[-1]
def getMin(self):
return self.min_stack[-1]
希望这篇文章对您有所帮助!如果您有任何问题,请随时与我联系。