返回
独家详解:进阶算法【刷题打卡】155. 最小栈
闲谈
2024-01-06 19:11:20
在解决问题之前,我们必须透彻理解其核心概念。首先,最小栈是一个特殊的栈,它除了具备普通栈的基本操作(如压入、弹出元素)之外,还支持另外一个操作:获取栈中最小元素。
现在,让我们正式进入解决方案的探讨。对于这道题目,我们可以采用多种策略,最简单直接的方法便是使用两个栈。第一个栈用来存储常规元素,而第二个栈则用于追踪并记录当前最小元素。当我们需要获取最小元素时,直接从第二个栈中弹出即可。然而,需要注意的是,在进行常规元素的入栈或出栈操作时,都需要同时对第二个栈进行相应的操作,以保持其存储最小元素的准确性。
如果您对上述方法仍感陌生,那么我们接下来将提供更详细的代码示例。
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
self.min_stack = []
def push(self, x):
"""
:type x: int
:rtype: void
"""
self.stack.append(x)
if not self.min_stack or x <= self.min_stack[-1]:
self.min_stack.append(x)
def pop(self):
"""
:rtype: void
"""
if self.stack.pop() == self.min_stack[-1]:
self.min_stack.pop()
def top(self):
"""
:rtype: int
"""
return self.stack[-1]
def getMin(self):
"""
:rtype: int
"""
return self.min_stack[-1]
# 示例:
minStack = MinStack()
minStack.push(-2)
minStack.push(0)
minStack.push(-3)
print(minStack.getMin()) # -3
minStack.pop()
print(minStack.top()) # 0
print(minStack.getMin()) # -2
在上面的代码中,我们使用了一个辅助的最小栈min_stack,其中维护了所有入栈元素的最小值。当执行常规入栈操作时,我们会同时将元素添加到stack中,并与min_stack的顶端元素进行比较,如果新的元素更小,则将其压入min_stack。弹出元素时,如果弹出元素与min_stack顶端元素相等,则也将其弹出。这样,min_stack始终保存着当前最小值,每次调用getMin()方法时,都可直接返回min_stack顶端的元素。
至此,我们已经详细介绍了【刷题打卡】155. 最小栈的解题思路和代码实现。掌握了这一方法,您将能够轻松解决此类算法问题,同时为后续的编程挑战奠定坚实的基础。