leetcode155. 最小栈

题目描述

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

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

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

思考

使用一个列表,然后充当栈。在实际中我也经常这样干。

class MinStack(object):

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

    def push(self, x):
        """
        :type x: int
        :rtype: None
        """
        self.stack.append(x)

    def pop(self):
        """
        :rtype: None
        """
        self.stack.pop()

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

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

# 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()

结果:
leetcode155. 最小栈_第1张图片

优化

上面模拟栈的耗时主要是查询最小值这里,至于入栈和出栈都是原子操作。所以我们这里要优化一下查找最小值的方法。
由于我们每次入栈都可以拿到元素,故可以在入栈的时候判断大小;
由于判断的是当前栈中的最小值,故而需要在出栈的时候,再次判断最小值。
故可以设置两个变量,存储最小值和次小值,但是这样的话,最小值和次小值的初始值设置为多大合适,也是一个问题。但是,这样就不适用与连续出栈的情况,故而我们需要用一个列表来每次入栈或者出栈,就记录当前栈中的最小值。碰巧的是,每次出栈,也让本次辅助栈最小值出栈,得到的是出栈后的最小,因为前面判断过的。

代码实现

class MinStack(object):

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

    def push(self, x):
        """
        :type x: int
        :rtype: None
        """
        self.stack.append(x)
        if len(self.min_stack) == 0 or x < self.min_stack[-1]:
            # 没有元素或者是最小,就记录最小值是当前值
            self.min_stack.append(x)
        else:
            # x不是最小值,本次栈的最小值不变,还是self.min_stack[-1]
            self.min_stack.append(self.min_stack[-1])


    def pop(self):
        """
        :rtype: None
        """
        self.stack.pop()
        self.min_stack.pop()


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

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

# 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()

结果:
leetcode155. 最小栈_第2张图片


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack

你可能感兴趣的:(leetcode刷题集合,#,leetcode,简单难度)