155.最小栈

设计一个有getMin功能的栈

要求:pop、push、getMin操作的时间复杂度都是O(1),设计时可以使用现成的栈结构

思路:使用两个栈,一个栈stackData用来保存当前栈中的元素,和普通栈没区别,另一个栈stackMin用于保存每一步的最小值。

(1)压入数据规则

如果当前数据为newNum,先将其压入stackData。然后判断stackMin是否为空:

  • 如果为空,则newNum也压入stackMin
  • 否则,比较nuwNum和stackMin栈顶元素哪一个更小
    • 如果newNum更小或者两者相等,则newNum也压入stackMin
    • 否则stackMin不压入任何内容

(2)弹出数据规则

先在stackData中弹出栈顶元素,记为value。value等于stackMin的栈顶元素时,弹出该栈顶元素,否则不弹出栈顶元素,返回value。

class MinStack(object):

    def __init__(self):
        self.stackData = []
        self.stackMin = []
        

    def push(self, x):
        self.stackData.append(x)
        if len(self.stackMin) == 0 or x<=self.getMin():
            self.stackMin.append(x)

    def pop(self):
        if len(self.stackData) == 0:
            return
        value = self.stackData.pop()
        if value == self.stackMin[-1]:
            self.stackMin.pop()
        return value
        

    def top(self):
        if len(self.stackData) == 0:
            return
        return self.stackData[-1]
        

    def getMin(self):
        if len(self.stackMin) == 0:
            return
        return self.stackMin[-1]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容