python - 在恒定时间内检索堆栈中的最小元素

标签 python python-3.x stack min

你能帮我理解这行代码发生了什么吗?

def push(self, x):
    self.stack.append(x)
    if len(self.minStack):
        if x < self.minStack[-1][0]:
            self.minStack.append([x, 1])
        elif x == self.minStack[-1][0]:
            self.minStack[-1][1] += 1
    else:
        self.minStack.append([x, 1])

取自此代码行:

class MinStack2:
    def __init__(self):
        self.stack, self.minStack = [], []

    # @param x, an integer
    # @return an integer

    def push(self, x):
        self.stack.append(x)
        if len(self.minStack):
            if x < self.minStack[-1][0]:
                self.minStack.append([x, 1])
            elif x == self.minStack[-1][0]:
                self.minStack[-1][1] += 1
        else:
            self.minStack.append([x, 1])

您还可以在这个 GitHub 帐户中找到它:https://github.com/kamyu104/LeetCode/blob/master/Python/min-stack.py

提前谢谢

如果对您有任何误解,请不要随意标记。而是留下反馈。这是一个学习平台,我觉得在没有解释的情况下标记帖子是非常没有受过教育的

最佳答案

每当您插入到堆栈上时,您还会检查该项目是否小于之前的最小值(该最小值保存在minStack的顶部)以及堆栈中有多少该项目。

如果该项目较小,则将其(计数为 1)推送到 minStack 上。如果相同,则将该项目的计数加一。

每次弹出一个项目时,如果它是堆栈中最小的项目(即 == minStack[-1][0]),则会减少最小项目的计数。如果该计数变为零,则将该项从 minStack 中弹出。现在,堆栈中最小的项目就是添加第一个较小项目之前的内容。这是因为为了丢弃最小项目的第一个实例,我们必须首先弹出它上面的所有内容,本质上是将堆栈回滚到添加最小元素的时间点。

PS:当您发现自己编写自己的堆栈实现时,请知道任何不返回其 pop 的项的堆栈都会表现得非常奇怪。

关于python - 在恒定时间内检索堆栈中的最小元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50070458/

相关文章:

macos - 这个汇编函数序言/尾声代码对 rbp/rsp/leave 有什么作用?

Python如何删除Kafka主题下的所有消息

python - 如何将 html 字符串转储到 python 扭曲模板中

python - 将 QChartView 插入 ui

python - Glob 不打印结果

android - 如何在现有 Activity 之间切换?

Python:更新元组列表......最快的方法

python - 卡住帧检测openCV python

python - 在 Python 3 中使用 io.BufferedReader 快速读取 gzip(文本文件)

java - 我的前缀表达式计算器出现问题