返回

独家详解:进阶算法【刷题打卡】155. 最小栈

闲谈

在解决问题之前,我们必须透彻理解其核心概念。首先,最小栈是一个特殊的栈,它除了具备普通栈的基本操作(如压入、弹出元素)之外,还支持另外一个操作:获取栈中最小元素。

现在,让我们正式进入解决方案的探讨。对于这道题目,我们可以采用多种策略,最简单直接的方法便是使用两个栈。第一个栈用来存储常规元素,而第二个栈则用于追踪并记录当前最小元素。当我们需要获取最小元素时,直接从第二个栈中弹出即可。然而,需要注意的是,在进行常规元素的入栈或出栈操作时,都需要同时对第二个栈进行相应的操作,以保持其存储最小元素的准确性。

如果您对上述方法仍感陌生,那么我们接下来将提供更详细的代码示例。

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. 最小栈的解题思路和代码实现。掌握了这一方法,您将能够轻松解决此类算法问题,同时为后续的编程挑战奠定坚实的基础。