首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【LeetCode 155】—最小栈 - 详解与实现

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

作者头像
我不是呆头
发布2025-12-20 13:18:40
发布2025-12-20 13:18:40
940
举报

摘要

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

  • 清晰的图解 + 多语言代码(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. 当出栈时,如果出栈元素等于最小栈顶元素,则最小栈也要出栈

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

代码实现

代码语言:javascript
复制
#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)时间获取最小值的功能。关键点在于理解何时将元素压入最小栈,以及何时从最小栈弹出元素。这种双栈设计是解决此类问题的常用技巧。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 摘要
    • 题目描述
    • 解题思路
    • 代码实现
    • 代码分析
    • 复杂度分析
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档