LeetCode 155. 最小栈|Python 解法详解

LeetCode 155. 最小栈|Python 解法详解

CSDN 算法专题 · 栈与队列 | 难度:中等

题目信息

题目描述

设计支持 push、pop、top 和 getMin 的栈,所有操作都要求常数时间。

示例

text 复制代码
操作:push(-2), push(0), push(-3), getMin()
输出:-3

约束

调用 pop、top、getMin 时栈非空;操作次数不超过 3×10⁴。

解题思路

核心观察

使用主栈保存数据,辅助栈在每一层同步保存"截至当前位置的最小值"。入栈时压入 min(val,旧最小值),出栈时两栈同步弹出。

推导与执行步骤

  1. 初始化主栈和最小值栈
  2. push 时两栈各压入一个值
  3. pop 时两栈同步弹出
  4. top 查主栈,getMin 查辅助栈

为什么这个方法正确

算法始终围绕上述核心观察维护有效状态,并且每一步只排除已经能够证明不可能产生更优答案的情况。按照执行步骤处理后,所有可能影响答案的元素或节点都会被恰好检查,因此不会遗漏合法答案;状态更新又严格遵守题目约束,所以最终结果有效。

从边界看,空区间、单个元素、全部相同或完全不匹配等情况都会落入初始化条件或循环终止条件,不需要依赖未定义状态。实现时再重点检查下标、空节点和重复元素,即可保证算法在极端输入下仍然成立。

Python 代码

python 复制代码
# 解法核心:使用主栈保存数据,辅助栈在每一层同步保存"截至当前位置的最小值"。入栈时压入 min(val,旧最小值),出栈时两栈同步弹出。
# 实现步骤:
# 1. 初始化主栈和最小值栈
# 2. push 时两栈各压入一个值
# 3. pop 时两栈同步弹出
# 4. top 查主栈,getMin 查辅助栈

class MinStack:

    def __init__(self):
        self.stack = []
        self.min_stack = []

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

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

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

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

复杂度分析

  • 时间复杂度:每个操作 O(1)
  • 空间复杂度:O(n)

易错点

遇到等于当前最小值的元素也必须记录,否则弹出一个最小值后状态会丢失。

总结

这道题的关键是:使用主栈保存数据,辅助栈在每一层同步保存"截至当前位置的最小值"。理解这一点后,再结合边界条件检查,代码就能保持清晰且稳定。

相关推荐
打工仔折腾 AI2 分钟前
多台服务器日志分散难查?用Promtail+Loki+Grafana搭建集中检索平台
服务器·人工智能·后端·python·性能优化·django·grafana
ysu_03143 分钟前
uv实战指南-从Python版本虚拟环境到pyproject依赖管理
开发语言·python·pip·uv·虚拟环境·包管理·依赖管理
打工仔折腾 AI14 分钟前
DiPlay 实测:iPhone 绕过硬件盒子直连 BYD 车机的思路拆解
android·人工智能·后端·python·gradle·iphone·ai agent 实战
東隅已逝,桑榆非晚30 分钟前
c++模板进阶
开发语言·c++·笔记·学习
老歌老听老掉牙5 小时前
空间曲线数据的拼接与几何变换分析
python·曲线
Cc.Y5 小时前
Java零基础入门:字符串深度掌握——从基础API到StringBuilder性能优化
java·开发语言·性能优化
databook9 小时前
使用 SciPy 库进行时间序列分析
python·数据分析·scipy
java资料站9 小时前
十一、评估测试
开发语言·人工智能·python
szial9 小时前
网络爬虫与 CDP 实战(二):浏览器能访问,Python 却被拒绝?拆开登录态与 CSRF
爬虫·python·csrf
左手の明天9 小时前
SLIP 协议封装与解析详解:原理、C 代码与实战案例
linux·c语言·开发语言·c++