返回

LeetCode 155 题最小栈:简明扼要的解决方案

前端

使用两个栈解决 LeetCode 155 题最小栈问题

在计算机科学中,栈是一种遵循后进先出(LIFO)原则的线性数据结构。在 LeetCode 155 题最小栈中,我们要求实现一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。

问题陈述

设计一个栈,它具有以下功能:

  • push(x):将元素 x 推入栈中。
  • pop():移除并返回栈顶元素。
  • top():返回栈顶元素,但不移除它。
  • getMin():返回栈中最小元素。

算法设计

为了满足题目的要求,我们将使用两个栈:一个数据栈和一个最小栈。

  • 数据栈 :用于存储数据元素。
  • 最小栈 :用于存储栈中最小元素。

当我们将一个元素推入数据栈时,我们也会将该元素与最小栈中的最小元素进行比较。如果该元素小于或等于最小栈中的最小元素,则将其添加到最小栈中。这样,最小栈始终包含栈中最小元素。

当我们从数据栈中移除一个元素时,如果该元素是最小栈中的最小元素,则我们需要从最小栈中移除它。这样,最小栈始终包含栈中最小元素。

通过使用两个栈,我们可以在常数时间内检索到栈中最小元素。

代码实现

以下是用 Python 实现的最小栈代码:

class MinStack:
    def __init__(self):
        self.data_stack = []
        self.min_stack = []

    def push(self, x):
        self.data_stack.append(x)
        if not self.min_stack or x <= self.min_stack[-1]:
            self.min_stack.append(x)

    def pop(self):
        if self.data_stack[-1] == self.min_stack[-1]:
            self.min_stack.pop()
        return self.data_stack.pop()

    def top(self):
        return self.data_stack[-1]

    def getMin(self):
        return self.min_stack[-1]

复杂度分析

  • 时间复杂度:
    • push():O(1)
    • pop():O(1)
    • top():O(1)
    • getMin():O(1)
  • 空间复杂度:O(n),其中 n 是栈中元素的数量。

总结

本文提供了 LeetCode 155 题最小栈的详细解决方案。该解决方案使用两个栈来实现,一个栈用于存储数据,另一个栈用于存储最小元素,确保能够在常数时间内检索到最小元素。算法清晰易懂,代码实现简洁明了,有助于读者理解最小栈的实现原理和应用场景。

常见问题解答

  1. 为什么我们需要使用两个栈来实现最小栈?

    我们使用两个栈来确保能够在常数时间内检索到最小元素。如果我们只使用一个栈,我们每次都需要遍历整个栈才能找到最小元素,这需要 O(n) 的时间。

  2. 最小栈在哪些实际场景中很有用?

    最小栈在需要跟踪最小元素的场景中很有用。例如,它可以用于跟踪数组或链表中的最小元素,或用于实现堆栈排序算法。

  3. 是否有其他方法可以实现最小栈?

    是的,可以使用其他方法来实现最小栈,例如使用二叉搜索树或平衡树。然而,使用两个栈的方法是最简单的,也是实现最容易的。

  4. 最小栈的局限性是什么?

    最小栈的局限性在于它的空间复杂度为 O(n)。这使得它不适合存储大量元素。

  5. 如何使用最小栈?

    要使用最小栈,只需创建一个 MinStack 对象,然后使用 pushpoptopgetMin 方法操作栈即可。