155.最小栈 Python实现

155.最小栈 Python实现

“Stay hungry ,Stay young"

最近刚刚回家,打了两天游戏,从今天开始坚持刷一点算法题来使自己保持思考的状态,并记录下整个过程。

题目简介详情参考LeetCode155题,这是一道简单题
题目要求是实现一个栈,能够实现pop和push操作,并能返回栈最顶端的元素,这些操作对于python的基本数据结构而言都非常简单,因此不再赘述,重点是题目要求实现一个getMin操作,在常数时间内找到栈中元素的最小值并返回。
这里,我简单梳理一下思路:
首先,栈的特点是后进先出,本质上,也是一个线性结构,而线性结构的随机查找不可能在常数时间内完成,因此需要“用空间换取时间”的思想,这里提供一个思路,也是LeetCode上比较多的思路:

定义一个辅助栈

定义一个辅助栈和当前的栈同步,用于储存当前最小的元素,当元素push进栈时,判断这个元素是否小于目前辅助栈栈顶的最小元素,如果小于,则将它进辅助栈,否则,将栈顶元素复制再次进辅助栈
复杂度分析:

时间复杂度 O(1):压栈,出栈,获取最小值的时间复杂度都为 O(1)
空间复杂度 O(N) :包含 NN 个元素辅助栈占用线性大小的额外空间。
代码如下:
可以说是相当简单

class MinStack:
    def __init__(self):
        self.stack=[]
        self.minstack=[]

    def push(self, x: int) -> None:
        self.stack.append(x)
        if self.minstack==[]:
            self.minstack.append(x)
        else:
            self.minstack.append(min(x,self.minstack[-1]))
    def pop(self) -> None:
        self.stack.pop()
        self.minstack.pop()

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

    def getMin(self) -> int:
        return self.minstack[-1]

你可能感兴趣的:(数据结构,数据结构)