【问题标题】:Retrieving the minimum element in a stack at a constant time以恒定时间检索堆栈中的最小元素
【发布时间】:2018-10-08 18:35:44
【问题描述】:

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

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

提前谢谢你

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

【问题讨论】:

  • How to debug small programs (#2) - 使用代码,在其上添加输出语句并提供演示数据 - 直到您理解为止。提示:有 2 个列表(又名堆栈),一个按顺序获取所有元素,另一个在其中保存列表,其中包含“被推送且当时最小的元素”以及推送了多少个计数器 - 只是打印 @ 987654327@ 和 self.minStackpush(..) 的开头/结尾处并一次喂它[2,2,3,4,2,1,2,3,4,5,6,0] 应该让您了解它的作用。
  • 这个平台有关于你能学到什么的规则——它不是一个“教程”平台或“解释我的代码”论坛——所以你的问题超出了主题的范围。要了解详细信息,请阅读 how to askon-topic - 有时问题会得到回答,有时会被否决并标记为关闭 - 如果发生任何一种情况都没什么大不了的 - 它不反对 它只是关于如何论坛用户看到你的问题,如果它适合。
  • @PatrickArtner,我很高兴您留下了反馈并且没有标记帖子。我绝对知道标记帖子并不反对 me 。此外,我听说 stackoverflow 是一个提问的平台。我的问题当然不是针对教程,而是简单的回答和澄清。

标签: python python-3.x stack min


【解决方案1】:

每当您将push 放入堆栈时,您还会检查该项目是否小于先前的最小值,该最小值保留在minStack 的顶部,以及该项目在堆栈中的数量。

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

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

PS:当您发现自己编写自己的堆栈实现时,请知道任何不返回它pops 的项目的堆栈都表现得很奇怪。

【讨论】:

    猜你喜欢
    • 2016-08-12
    • 2016-11-12
    • 2012-10-24
    • 2018-10-07
    • 2012-02-13
    • 2019-05-20
    • 2015-05-11
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多