📌  相关文章
📜  使用在 O(1) 时间和 O(1) 额外空间内支持 getMin() 的数组设计一个动态堆栈(1)

📅  最后修改于: 2023-12-03 14:49:54.051000             🧑  作者: Mango

动态堆栈设计

简介

动态堆栈是一种基于数组实现的数据结构,它具有栈的特性,即先进后出。与普通堆栈不同的是,动态堆栈支持在 O(1) 时间复杂度和 O(1) 额外空间内获取最小值。

设计思路

为了实现动态堆栈,我们需要在每个元素中保存当前栈的最小值。为此,我们可以使用一个辅助数组来存储每个位置对应的最小值。

数据结构
Stack 类

Stack 类表示一个堆栈对象,具有以下属性和方法:

  • stack:用于存储堆栈的元素的数组
  • min_stack:用于存储堆栈的最小值的辅助数组

方法:

  1. push(item):将元素 item 入栈
  2. pop():从栈顶弹出并返回元素
  3. top():返回栈顶元素但不弹出
  4. getMin():返回堆栈的最小值
实现代码
class Stack:
    def __init__(self):
        self.stack = []
        self.min_stack = []

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

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

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

    def getMin(self):
        if self.min_stack:
            return self.min_stack[-1]
示例
stack = Stack()

stack.push(5)
stack.push(3)
stack.push(7)

print(stack.getMin())  # 输出 3

stack.pop()

print(stack.getMin())  # 输出 3

stack.push(2)

print(stack.getMin())  # 输出 2

以上代码会创建一个动态堆栈,并进行一些入栈、出栈操作,并输出最小值。

通过使用辅助数组来记录堆栈每一步的最小值,我们可以在 O(1) 时间复杂度内获取堆栈的最小值,同时在执行过程中只使用了 O(1) 的额外空间。这种设计可以在需要频繁获取堆栈最小值的场景中提供更高效的操作。