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

【LeetCode 155】—最小栈 - 详解与实现

坚持用 清晰易懂的图解 + 代码语言,让每个知识点变得简单!
🚀呆头个人主页详情
🌱 呆头个人Gitee代码仓库
📌 呆头详细专栏系列
座右铭: “不患无位,患所以立。”在这里插入图片描述


【LeetCode 155】—最小栈 - 详解与实现

  • 摘要
  • 目录
    • 题目描述
    • 解题思路
    • 代码实现
    • 代码分析
    • 复杂度分析
    • 总结


摘要

🚀 你好,欢迎来到《编程闯关记》!
这里是算法与数据结构的实战基地,也是你从“暴力解法”到“最优解”的进化场。

🔍 专栏初衷

  • 清晰的图解 + 多语言代码(Python/Java/C++/C),拆解每道题背后的逻辑。
  • 不只讲“怎么做”,更讲“为什么”——从题目分析、边界条件到复杂度优化。
  • 适合想夯实基础突击面试的你,尤其针对LeetCode/牛客高频题!

💡 如何使用本专栏
1️⃣ 先独立思考:尝试自己写出第一版代码(哪怕很烂)。
2️⃣ 对比解法:看看我的思路和你的差异,吸收优化技巧。
3️⃣ 举一反三:每篇末尾会附相似题目链接,趁热打铁。

📌 坚持打卡
算法没有捷径,但正确的方法能让你少走弯路。每天15分钟,和我一起用代码雕刻思维!

(正文开始👇)


目录

题目描述

力扣链接直达----------请点击

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

实现 MinStack 类:

  • MinStack() 初始化堆栈对象
  • void push(int val) 将元素val推入堆栈
  • void pop() 删除堆栈顶部的元素
  • int top() 获取堆栈顶部的元素
  • int getMin() 检索堆栈中的最小元素

解题思路

这道题的关键在于如何在常数时间内获取栈中的最小元素。普通栈只能访问栈顶元素,要获取最小值需要遍历整个栈,时间复杂度为O(n)。

为了实现O(1)时间获取最小值,我们可以使用辅助栈的方法:

  1. 使用两个栈:一个普通栈存储所有元素,一个最小栈只存储当前最小值
  2. 当有新元素入栈时,将其与最小栈顶元素比较,如果更小则也入最小栈
  3. 当出栈时,如果出栈元素等于最小栈顶元素,则最小栈也要出栈

这样,最小栈的栈顶元素始终是当前栈中的最小值。

代码实现

#include <stack>
#include <stdexcept>
using namespace std;// 最小栈的实现:普通栈 + 辅助栈
class MinStack {
public:MinStack() {}// 压栈操作void push(int val) {_st.push(val);  // 如果辅助栈为空,或者新值不大于当前最小值,则同步压入辅助栈if (_minst.empty() || val <= _minst.top()) {_minst.push(val);}}// 出栈操作void pop() {if (_st.empty()) return;  // 防御:空栈直接返回if (_st.top() == _minst.top()) {_minst.pop();        // 若栈顶是最小值,辅助栈同步出栈}_st.pop();               // 普通栈出栈}// 获取栈顶int top() {if (_st.empty()) throw runtime_error("stack is empty");return _st.top();}// 获取最小值int getMin() {if (_minst.empty()) throw runtime_error("min stack is empty");return _minst.top();}private:stack<int> _st;     // 普通栈:存所有元素stack<int> _minst;  // 辅助栈:只存最小值
};

代码分析

  1. 数据结构

    • _st:普通栈,用于存储所有入栈的元素
    • _minst:最小栈,只存储可能成为最小值的元素
  2. push操作

    • 将元素压入普通栈
    • 如果最小栈为空或新元素小于等于最小栈顶元素,则将新元素也压入最小栈
  3. pop操作

    • 如果普通栈顶元素等于最小栈顶元素,说明当前最小值要被弹出,最小栈也要弹出
    • 普通栈正常弹出元素
  4. top操作

    • 直接返回普通栈的栈顶元素
  5. getMin操作

    • 直接返回最小栈的栈顶元素,即为当前栈中的最小值

复杂度分析

  • 时间复杂度:所有操作均为 O(1)
  • 空间复杂度:O(n),最坏情况下,最小栈也需要存储所有元素

总结

这道题是栈的经典应用题,通过辅助栈的方式实现了O(1)时间获取最小值的功能。关键点在于理解何时将元素压入最小栈,以及何时从最小栈弹出元素。这种双栈设计是解决此类问题的常用技巧。

http://www.dtcms.com/a/360710.html

相关文章:

  • 阿里Qoder怎么样?实测对比TRAE SOLO 和 CodeBuddy IDE
  • 保健品跨境电商:如何筑牢产品质量与安全防线?
  • 数据库事务隔离级别与 MVCC 机制详解
  • 机器学习(四)KNN算法-分类
  • 哈希表-1.两数之和-力扣(LeetCode)
  • git将当前分支推送到远端指定分支
  • YOLO 目标检测:YOLOv3网络结构、特征输出、FPN、多尺度预测
  • Redis--Lua脚本以及在SpringBoot中的使用
  • 三、Gitee平台使用指南
  • 第 94 场周赛:叶子相似的树、模拟行走机器人、爱吃香蕉的珂珂、最长的斐波那契子序列的长度
  • Eclipse Compiler for Java (ECJ):安装指南与高效快捷键全解析
  • 构建无广告私人图书馆Reader与cpolar让电子书库随身携带
  • 鸿蒙总改变字体大小设置
  • 【Linux篇章】再续传输层协议UDP :从低可靠到极速传输的协议重生之路,揭秘无连接通信的二次进化密码!
  • 深度学习框架与工具使用心得:从入门到实战优化
  • Unity核心概念③:Inspector窗口可编辑变量
  • 电科金仓 KFS 场景化实践路径解析:从行业场景落地看技术价值转化
  • JP4-1-MyLesson项目简介
  • 掌握正则表达式与文本处理:提升 Shell 编程效率的关键技巧
  • Go 语言 sync 包解析
  • [React]监听Form中某个字段的变化
  • vue2》》Computed、Watch
  • 【Vue2 ✨】Vue2 入门之旅(四):生命周期钩子
  • Git从零到远程协作:手把手实战指南
  • C 语言进程通信之信号API
  • [线上问题排查]1.数据库死锁全解析与解决方案
  • 算法:插入排序
  • LeetCode 刷题【58. 最后一个单词的长度、59. 螺旋矩阵 II】
  • 【开题答辩全过程】以 基于SSM的拾光咖啡厅管理系统的设计与实现为例,包含答辩的问题和答案
  • Introduction to GIS —— Chapter 4(Raster Data Model)