leetcode 155. 最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。


示例:

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

提示:

  • poptop 和 getMin 操作总是在 非空栈 上调用

暴力法: 

# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
class MinStack(object):

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack = []
        self.minVal = None

    def push(self, x):
        """
        :type x: int
        :rtype: None
        """
        self.stack.append(x)
        self.minVal = x if self.minVal == None else min(self.minVal, x)


    def pop(self):
        """
        :rtype: None
        """
        x = self.stack.pop()
        if x == self.minVal:
            self.minVal = None if len(self.stack) == 0 else min(self.stack)

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


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

用一个值来维护栈中的最小值。每次push的时候检查x是否比已有最小值还要小,如果更小,更新,反之不更新。然后在栈pop的时候判断pop出去的值是不是最小值,如果是则更新栈内的最小值。getMin()则是直接返回保存的最小值。

辅助栈:

class MinStack:
    def __init__(self):
        self.stack = []
        self.min_stack = []
    def push(self, x: int) -> None:
        self.stack.append(x)
        if not self.min_stack or x <= self.min_stack[-1]: 
            self.min_stack.append(x)
    def pop(self) -> None:
        if self.stack.pop() == self.min_stack[-1]:
            self.min_stack.pop()
    def top(self) -> int:
        return self.stack[-1]
    def getMin(self) -> int:
        return self.min_stack[-1]

思路:借用一个辅助栈min_stack来保存stack中的最小值。

每当push()一个新值时,如果小于等于min_stack的栈顶值,则一起push到辅助栈中,此时辅助栈栈顶的最小值被更新。

当pop()栈顶的值时,判断是否和min_stack的栈顶最小值相等,如果相等则把min_stack的栈顶元素一起pop()。这样可以保证min_stack的栈顶元素始终是stack中的最小值。

你可能感兴趣的:(leetcode)