📅  最后修改于: 2023-12-03 15:41:45.044000             🧑  作者: Mango
在实际开发中,我们经常需要在一个集合中查找最小元素。本题要求我们使用栈来实现这一功能。具体来说,我们需要实现以下几个函数:
为了满足本题的限制条件,我们需要设计一种新的数据结构,该数据结构内部维护了一个栈和一个最小值变量。在 push 操作时,同时更新最小值变量;在 pop 操作时,同时检查被弹出元素是否为最小值。
具体实现中,我们可以使用两个栈来维护这个数据结构。其中一个栈用于保存原始元素,另外一个栈用于保存最小值。具体来说,我们维护一个变量 minVal,保存栈中的最小值。同时,我们维护一个辅助栈 minStack,用于保存在新元素入栈时,当前的最小值。
具体实现如下:
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
self.minStack = []
self.minVal = float('inf')
def push(self, x: int) -> None:
self.stack.append(x)
self.minVal = min(self.minVal, x)
self.minStack.append(self.minVal)
def pop(self) -> None:
self.stack.pop()
self.minStack.pop()
if len(self.minStack) > 0:
self.minVal = self.minStack[-1]
else:
self.minVal = float('inf')
def top(self) -> int:
return self.stack[-1]
def getMin(self) -> int:
return self.minVal
在实现中,我们使用了三个成员变量:
其中,压入元素时,我们先将该元素压入原始元素栈中。然后,我们更新变量 minVal 的值,使其等于原 minVal 与当前元素值的较小值。最后,我们将新的 minVal 压入最小元素栈中。在弹出元素时,我们同时弹出两个栈的栈顶元素,然后将最小元素的栈顶元素作为新的 minVal。
至此,我们已经实现了一个支持查找最小元素的栈,其 Push、Pop、Top、GetMin 操作都可以在 O(1) 时间内完成。
本题考察了数据结构的设计和实现方法。在实现过程中,我们通过同时维护一个元素栈和一个最小值栈,解决了查找最小元素的问题。在实际开发中,我们也可以借鉴这种思路,设计出更加高效的数据结构来满足不同的需求。