用辅助栈实现o(1)获取最小值:维护一个非严格单调递减的辅助栈,与主栈同步push/pop,重复最小值需重复入栈,getmin()直接返回辅助栈顶,空间复杂度最坏o(n),时间复杂度均为o(1)。

用栈实现 O(1) 获取最小值,核心思路是:**额外维护一个单调递减的辅助栈,同步记录当前主栈中每个状态下的最小值**。
辅助栈同步记录最小值
每当向主栈 push 一个新元素时,同时判断它是否 ≤ 当前最小值(即辅助栈顶),若是,就也 push 到辅助栈;pop 时,若主栈弹出的元素等于辅助栈顶,则辅助栈也 pop。这样辅助栈的栈顶始终是主栈当前所有元素的最小值。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 辅助栈不存所有元素,只存“历史最小值的候选者”,所以它是非严格单调递减的
- 重复最小值要重复入辅助栈,否则 pop 一次就把所有相同最小值“误删”了
- getMin() 直接返回辅助栈.peek(),时间复杂度 O(1)
代码结构清晰,关键在 push/pop 的联动
主栈用 Deque
- push(x):先 push 主栈;再比较 x ≤ minStack.peek()(非空时),满足则 push minStack
- pop():先取主栈栈顶;若该值等于 minStack.peek(),minStack 也 pop
- top() 和 getMin() 都需判空,抛出 IllegalStateException 或返回特殊值(按题目要求)
空间换时间,最坏情况辅助栈与主栈等长
虽然最坏情况下(输入序列单调递减)辅助栈长度 = 主栈长度,但这是必要代价;平均情况下空间利用率更高。没有更优的 O(1) 空间解法——O(1) 时间获取最小值必然需要 O(n) 最坏空间来记录中间极小值信息。
- 不能只存一个 min 变量:pop 后无法还原之前的最小值
- 不能每次 getMin 遍历主栈:退化为 O(n)
- 辅助栈方案是标准且最优的工程实践解
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










