力扣题解:155. 最小栈

71 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

一、题目描述:

155. 最小栈 - 力扣(LeetCode)

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

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。  

示例 1:

输入:
["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.

提示:

  • -2^31 <= val <= 2^31 - 1
  • pop、top 和 getMin 操作总是在 非空栈 上调用
  • push, pop, top, and getMin最多被调用 3 * 10^4 次

二、思路分析:

问题就在于实现返回最小值的功能

每次压入元素的时候,比较一次,就能把最小值记录下来

但是当有元素弹出时,保存的就不一定是最小值了

所以把每个元素压入时的最小值也用一个列表保存起来

和元素弹出时一起弹出,保持同步

三、AC 代码:

class MinStack(object):

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


    def push(self, val):
        """
        :type val: int
        :rtype: None
        """
        if not self.min_val or self.min_val[-1] >= val:
            self.min_val.append(val)
        else:
            self.min_val.append(self.min_val[-1])
        self.stack.append(val)


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


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

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



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

四、总结:

这道题的思想很简单:“以空间换时间”,使用辅助栈是常见的做法。

范文参考:

使用辅助栈(同步和不同步,Python 代码、Java 代码) - 最小栈 - 力扣(LeetCode) (leetcode-cn.com)

155. 最小栈 题解 - 力扣(LeetCode)