📜  设计一个栈来检索原始元素并返回 O(1) 时间和 O(1) 空间中的最小元素(1)

📅  最后修改于: 2023-12-03 15:41:45.044000             🧑  作者: Mango

设计一个栈来检索原始元素并返回 O(1) 时间和 O(1) 空间中的最小元素

在实际开发中,我们经常需要在一个集合中查找最小元素。本题要求我们使用栈来实现这一功能。具体来说,我们需要实现以下几个函数:

  • push(x): 将元素 x 压入栈中;
  • pop(): 弹出栈顶元素;
  • top(): 返回栈顶元素,但不弹出;
  • getMin(): 返回栈中最小元素。
解题思路

为了满足本题的限制条件,我们需要设计一种新的数据结构,该数据结构内部维护了一个栈和一个最小值变量。在 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

在实现中,我们使用了三个成员变量:

  • stack:保存原始元素的栈;
  • minStack:保存最小元素的栈;
  • minVal:保存栈中的最小值。

其中,压入元素时,我们先将该元素压入原始元素栈中。然后,我们更新变量 minVal 的值,使其等于原 minVal 与当前元素值的较小值。最后,我们将新的 minVal 压入最小元素栈中。在弹出元素时,我们同时弹出两个栈的栈顶元素,然后将最小元素的栈顶元素作为新的 minVal。

至此,我们已经实现了一个支持查找最小元素的栈,其 Push、Pop、Top、GetMin 操作都可以在 O(1) 时间内完成。

总结

本题考察了数据结构的设计和实现方法。在实现过程中,我们通过同时维护一个元素栈和一个最小值栈,解决了查找最小元素的问题。在实际开发中,我们也可以借鉴这种思路,设计出更加高效的数据结构来满足不同的需求。