在固定时间检索堆栈中的最小元素

时间:2018-04-27 21:20:35

标签: 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

提前谢谢

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

1 个答案:

答案 0 :(得分:2)

每当你push进入堆栈时,你还要检查这个项目是否小于先前的最小值(保留在minStack之上),以及该项目的数量是多少在堆栈中。

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

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

PS:当你发现自己编写自己的堆栈实现时,要知道任何没有返回它pop的项目的堆栈都表现得非常奇怪。