LeetCode 155 题最小栈:简明扼要的解决方案
2024-02-11 13:31:19
使用两个栈解决 LeetCode 155 题最小栈问题
在计算机科学中,栈是一种遵循后进先出(LIFO)原则的线性数据结构。在 LeetCode 155 题最小栈中,我们要求实现一个支持 push
、pop
、top
操作,并能在常数时间内检索到最小元素的栈。
问题陈述
设计一个栈,它具有以下功能:
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 题最小栈的详细解决方案。该解决方案使用两个栈来实现,一个栈用于存储数据,另一个栈用于存储最小元素,确保能够在常数时间内检索到最小元素。算法清晰易懂,代码实现简洁明了,有助于读者理解最小栈的实现原理和应用场景。
常见问题解答
-
为什么我们需要使用两个栈来实现最小栈?
我们使用两个栈来确保能够在常数时间内检索到最小元素。如果我们只使用一个栈,我们每次都需要遍历整个栈才能找到最小元素,这需要 O(n) 的时间。
-
最小栈在哪些实际场景中很有用?
最小栈在需要跟踪最小元素的场景中很有用。例如,它可以用于跟踪数组或链表中的最小元素,或用于实现堆栈排序算法。
-
是否有其他方法可以实现最小栈?
是的,可以使用其他方法来实现最小栈,例如使用二叉搜索树或平衡树。然而,使用两个栈的方法是最简单的,也是实现最容易的。
-
最小栈的局限性是什么?
最小栈的局限性在于它的空间复杂度为 O(n)。这使得它不适合存储大量元素。
-
如何使用最小栈?
要使用最小栈,只需创建一个
MinStack
对象,然后使用push
、pop
、top
和getMin
方法操作栈即可。