Min Stack

要想O(1)时间只有一个办法,照牛客网里面说的用双栈,一个栈放数据,一个栈放当前最小值

class MinStack(object):

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.store = []
        self.minStore = []
        self.curMin = sys.maxint

    def push(self, x):
        """
        :type x: int
        :rtype: void
        """
        self.store.append(x)
        self.curMin = min(self.curMin, x)
        self.minStore.append(self.curMin)

    def pop(self):
        """
        :rtype: void
        """
        self.store.pop()
        self.minStore.pop()
        self.curMin = self.minStore[-1] if self.minStore else sys.maxint

    def top(self):
        """
        :rtype: int
        """
        return self.store[-1]

    def getMin(self):
        """
        :rtype: int
        """
        return self.minStore[-1]

还有一种单栈就可以实现查最小值的方法,当压入元素不大于当前最小值时,当前最小值先被压入,再压入输入元素,这样保证了top操作只需要返回栈顶元素就是正确的,getmin操作也是一样,同时pop时如果pop元素等于最小值,那说明这个值压入时一起压入了它之前的一个最小值进栈,这时我们再pop一个数到min变量上就是pop这个元素之后栈的最小值了,稍微有点点绕,但是是个很巧妙的方法

class MinStack(object):

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack = []
        self.min = sys.maxint

    def push(self, x):
        """
        :type x: int
        :rtype: void
        """
        if x <= self.min:
            self.stack.append(self.min)
            self.min = x
        self.stack.append(x)

    def pop(self):
        """
        :rtype: void
        """
        if self.stack.pop() == self.min:
            self.min = self.stack.pop()

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

    def getMin(self):
        """
        :rtype: int
        """
        return self.min

results matching ""

    No results matching ""