LeetCode 155. 最小栈(Min Stack)

155. 最小栈

📘题目描述

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

实现 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.

💡解题思路:辅助栈存最小值

使用两个栈:

  • 主栈 stack:用于存储所有元素

  • 辅助栈 min_stack:用于存储当前最小值

✅维护逻辑:

  • push(val)

    • 正常推入 stack

    • 如果 val <= min_stack[-1],也推入 min_stack

  • pop()

    • 如果弹出值等于 min_stack[-1],也要同步弹出

  • getMin()

    • 返回 min_stack[-1] 即可,时间复杂度 O(1)

✅Python代码 

class MinStack:

    def __init__(self):
        self.stack = []      # 主栈,存所有元素
        self.min_stack = []  # 辅助栈,存最小值

    def push(self, val: int) -> None:
        self.stack.append(val)
        # 只有当 val 更小或相等时才入最小栈
        if not self.min_stack or val <= self.min_stack[-1]:
            self.min_stack.append(val)

    def pop(self) -> None:
        val = self.stack.pop()
        # 如果弹出的是最小值,也要同步弹出辅助栈
        if val == 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]

⏱️复杂度分析 

操作时间复杂度空间复杂度
pushO(1)O(n)
popO(1)O(n)
topO(1)O(1)
getMinO(1)O(1)

🧱易错点总结 

易错点正确做法说明
弹出主栈未同步辅助栈if val == min_stack[-1] 时也要 pop
辅助栈每次都入栈所有元素应该只记录当前最小值(含重复)
空栈判断不完整或越界访问注意所有访问 [-1] 前判断非空

🧠优化拓展

✅方式二:辅助栈存 (val, 当前最小值) 元组

class MinStack:
    def __init__(self):
        self.stack = []

    def push(self, val: int) -> None:
        current_min = val if not self.stack else min(val, self.stack[-1][1])
        self.stack.append((val, current_min))

    def pop(self) -> None:
        self.stack.pop()

    def top(self) -> int:
        return self.stack[-1][0]

    def getMin(self) -> int:
        return self.stack[-1][1]

优点:结构更紧凑,只用一个栈存储所有信息。 

🎯总结

  • 本题是栈的经典设计题,重点考查辅助栈思想

  • 所有操作需 O(1) 完成,推荐双栈结构或元组压栈方式实现

  • 是系统设计类题目的入门题之一,适合练习类封装、状态管理等技巧

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值