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

155. 最小栈(MinStack)题解

题目回顾

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

实现MinStack类:

  • MinStack()初始化栈

  • void push(int val)将元素 val 推入栈

  • void pop()删除栈顶元素

  • int top()获取栈顶元素

  • int getMin()获取栈中最小元素

示例:

输入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]] 输出: [null,null,null,null,-3,null,0,-2]

解题思路

核心问题

普通栈无法在O(1)时间获取最小值,因为pop()可能改变栈中最小值。

解决方法:使用辅助栈(双栈法)


双栈法

维护两个栈:

栈名功能
data存储所有元素
minStk存储当前栈的最小值
操作规则:
  1. push(val)

    • data 栈正常入栈

    • min 栈入栈min(val, minStk.top())(保证栈顶永远是最小值)

  2. pop()

    • data 栈 pop

    • min 栈 pop

  3. top()

    • 返回 data 栈顶

  4. getMin()

    • 返回 min 栈顶


动态演示

操作: push(-2) data: [-2] min : [-2] 操作: push(0) data: [-2,0] min : [-2,-2] 操作: push(-3) data: [-2,0,-3] min : [-2,-2,-3] getMin() -> -3 pop() data: [-2,0] min : [-2,-2] getMin() -> -2

C++ 实现

#include <stack> using namespace std; class MinStack { private: stack<int> data; stack<int> minStk; public: MinStack() { } void push(int val) { data.push(val); if (minStk.empty()) minStk.push(val); else minStk.push(min(val, minStk.top())); } void pop() { data.pop(); minStk.pop(); } int top() { return data.top(); } int getMin() { return minStk.top(); } };

优化思路(可选)

  1. 单栈+差值法

    • 只用一个栈,通过存储val - min差值来记录历史最小值

    • 优点:节省空间

    • 缺点:逻辑复杂,不易理解

  2. 面试时推荐:

    • 实现双栈法,稳、易懂

    • 口头提及单栈法,显示你掌握高级技巧


复杂度分析

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

总结:

  • 双栈法是最直观、面试最稳的方案

  • min 栈保证了 O(1) 时间取最小值

  • 逻辑清晰,代码简洁

http://www.jsqmd.com/news/551262/

相关文章:

  • BAAI/bge-m3快速入门:3步搭建你的第一个语义相似度分析工具
  • OpenClaw云端体验:通过星图平台快速试用GLM-4.7-Flash镜像
  • 实测|WSL2 从零部署 OpenClaw AI 助手:安装配置与实战运行教程
  • 从电子表到服务器:聊聊32.768kHz这颗“时间之心”的封装变迁史(DT-26、SMD3225对比)
  • OBS Studio直播架构解析:多源场景管理与实时转场性能优化
  • FastReport安装避坑指南:Delphi开发者必知的5个关键步骤
  • AI 大模型绘图日常使用教程|零门槛上手,快速出图不踩坑
  • OpenLdap部署
  • 2026年GPT-5.4实战应用完全指南
  • OBS多平台直播解决方案:obs-multi-rtmp插件全攻略
  • 造相-Z-Image效果对比:BF16 vs FP16在4090上的画质与稳定性差异
  • 多无人机协同避障之自适应重构 V 型编队与分布式控制算法探索
  • 【应用】运营营销人该如何看待OpenClaw?
  • 【唠嗑第二嗑-代码里面的无为思想,空空如也的接口】
  • AI 对人类的影响与普通人的应对策略
  • Bing SEO优化实战:从零开始提升网站排名的5个关键步骤
  • 从 Hugging Face 到本地:ProcessorMixin 模型保存与加载的完整指南
  • 基于 Simulink 的 多目标优化:效率 + 动态响应 + 纹波
  • Python爬虫实战:如何绕过央视频加密获取高清视频源(附完整代码)
  • BiliTools全能B站资源下载工具:高效获取视频资源的新手必备指南
  • 3分钟搞定:Source Code Pro字体终极配置指南,让代码阅读体验提升300%
  • 探秘书匠策AI:论文开题报告的“全能小助手”
  • Windows 7如何突破Python版本限制?企业级兼容性解决方案指南
  • Leather Dress Collection多场景落地:独立设计师IP开发、虚拟试衣、NFT服饰创作
  • 让演示更灵活:PPT和PPS格式互换的实用方法
  • 【shell编程】深入解析Permission denied:7种实战解决方案与场景应用
  • 万字长文 解析串口通信
  • YOLOFuse镜像亮点解析:环境零配置与多种融合策略详解
  • Git + 云原生:如何管理 K8s 配置版本?从踩坑到 GitOps 落地,全网最细实战手册
  • 最全|OpenClaw 2026年阿里云部署方法,小白7分钟掌握