当前位置: 首页 > news >正文

LeetCode 155. 最小栈:Java 双栈解法详解

文章目录

    • 1. 问题描述
    • 2. 核心要求
    • 3. 实现思路
      • 双栈同步法
    • 4. 完整代码实现
    • 5. 复杂度分析
    • 6. 总结与优化方向
      • 方法优势
      • 优化方向
      • 适用场景

1. 问题描述

设计一个支持 pushpoptop 操作,并能在 常数时间 内检索到最小元素的栈。要求所有操作的时间复杂度均为 O(1)。

示例输入输出

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. 核心要求

  • 功能要求:实现栈的基本操作,并高效获取最小值。
  • 时间复杂度:所有操作(push, pop, top, getMin)必须为 O(1)。
  • 空间复杂度:尽可能优化,但允许使用额外空间。

3. 实现思路

双栈同步法

通过维护两个栈实现功能:

  1. 主栈 (stack):存储所有元素。
  2. 辅助栈 (minStack):存储每个主栈状态下的最小值,与主栈同步操作。

关键操作

  • 入栈 (push):主栈压入元素,辅助栈压入当前最小值。
  • 出栈 (pop):主栈和辅助栈同步弹出栈顶元素。
  • 最小值查询 (getMin):直接访问辅助栈顶元素。

同步原理
每次入栈时,辅助栈记录当前主栈的最小值;出栈时,辅助栈同步弹出元素,确保其栈顶始终是主栈当前的最小值。


4. 完整代码实现

import java.util.Deque;
import java.util.LinkedList;class MinStack {private Deque<Integer> stack;      // 主栈:存储所有元素private Deque<Integer> minStack;   // 辅助栈:存储每个状态的最小值public MinStack() {stack = new LinkedList<>();minStack = new LinkedList<>();}public void push(int val) {stack.push(val);// 辅助栈压入当前最小值:若栈为空,当前值为最小;否则与栈顶比较if (minStack.isEmpty()) {minStack.push(val);} else {minStack.push(Math.min(minStack.peek(), val));}}public void pop() {stack.pop();minStack.pop();  // 同步弹出辅助栈顶元素}public int top() {return stack.peek();  // 返回主栈顶元素}public int getMin() {return minStack.peek();  // 返回辅助栈顶元素(当前最小值)}
}

5. 复杂度分析

  • 时间复杂度:所有操作均为 O(1),直接访问栈顶元素。
  • 空间复杂度:O(n),其中 n 为操作次数。辅助栈与主栈大小相同,最坏情况下存储所有元素的最小值。

6. 总结与优化方向

方法优势

  • 直观易懂:双栈同步操作逻辑清晰,代码简洁。
  • 严格满足时间复杂度要求:所有操作均在常数时间内完成。

优化方向

  1. 空间优化:辅助栈可以不存储所有状态的最小值,而是当新值 ≤ 当前最小值时才压入辅助栈。弹出时,仅当主栈顶等于辅助栈顶时才弹出辅助栈顶。
    示例
    public void push(int val) {stack.push(val);if (minStack.isEmpty() || val <= minStack.peek()) {minStack.push(val);}
    }public void pop() {if (stack.pop().equals(minStack.peek())) {minStack.pop();}
    }
    
    优点:减少辅助栈空间占用。
    缺点:代码复杂度稍高,需处理对象相等性问题(如使用 Integer 时需用 equals 比较)。

适用场景

  • 对时间复杂度要求严格,且可接受额外空间的场景。
  • 需要快速获取最小值的栈结构设计问题。
http://www.xdnf.cn/news/514981.html

相关文章:

  • 【DeepSeek论文精读】11. 洞察 DeepSeek-V3:扩展挑战和对 AI 架构硬件的思考
  • STM32F103_LL库+寄存器学习笔记24 - TIM产生中心PWM波,中心对齐模式1 + PWM模式2(FOC算法专用)
  • AM32电调学习解读五:tenKhzRoutine
  • 第二十八天打卡
  • Linux常用命令44——bzip2压缩或解压缩.bz2文件
  • 【Spring】核心机制:IOC与DI深度解析
  • docker 安装 jenkins
  • 通俗解释Transformer在处理序列问题高效的原因(个人理解)
  • C++几何计算器
  • 【IP101】图像多尺度分析:金字塔结构的原理、构建与高级应用
  • 【SpringBoot】✈️整合飞书群机器人发送消息
  • JavaScript基础-获取元素
  • 【QGIS二次开发】地图编辑-09
  • python + pip 独家秘籍
  • printf函数参数与入栈顺序
  • 翻到了一段2005年写的关于需求的文字
  • java每日精进 5.18【文件存储】
  • Ubuntu 18.04设置静态IP的方法(图形化操作)
  • 美丽的独处时光
  • 菱形继承原理
  • java集合相关的api-总结
  • 2025年- H27-Lc135- 239.滑动窗口最大值(自定义双端队列)---java版
  • 量子计算在金融科技中的应用前景
  • [Codeforce刷题8]
  • 无废话离线大模型安装
  • 【随机过程】贝叶斯估计
  • 游戏引擎学习第292天:实现蛇
  • es聚合-词条统计
  • 量子计算 | 量子密码学的挑战和机遇
  • LWIP的NETCONN接口