LeetCode Hot100(51/100)——155. 最小栈

文章目录

一、题目描述

题目链接:LeetCode CN - Min Stack

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

实现 MinStack 类:

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

所有操作的时间复杂度均需为 O(1)


二、思维导图梳理

Min Stack
设计要求
push(val)
pop()
top()
getMin()
时间复杂度 O(1)
解法思路
方法一:辅助最小栈
方法二:使用栈存储差值
方法三:仅使用一个栈记录元组
分析维度
时间复杂度
空间复杂度
栈操作流程


三、解法原理剖析

方法一:使用辅助最小栈

为了在 O(1) 时间内得到最小值,我们可以使用两个栈:

  • 数据栈(dataStack):正常存储入栈的数据。
  • 最小值栈(minStack):同步记录对应位置的最小值。
思路解析
操作 dataStack minStack
push(5) 5 5
push(3) 5, 3 5, 3(3是当前最小值)
push(7) 5, 3, 7 5, 3, 3(3仍是最小)
pop() 5, 3 5, 3
getMin() 返回 minStack 栈顶元素 3

每次压入新值时,minStack 栈顶保存的是当前所有元素的最小值。


方法二:仅使用一个栈,记录差值

可以只用一个栈,通过记录当前值与最小值的差来避免使用双栈。

  • 记录最小值 min
  • 压栈时存储差值:val - min
  • 当压入比当前最小值更小的元素时,特别更新最小值。

这种方式比较巧妙,但对负差值的计算要格外注意,因此一般更推荐双栈法。


方法三:同栈存储元组 (val, minVal)

每个栈元素同时记录当前值和当前最小值,此时只需一个栈,每次压入:

text 复制代码
栈顶元素 = [当前值, 当前最小值]

取最小值时读取栈顶元素的第二个字段即可。


四、操作流程图

以下是"辅助最小栈"解法的流程示意:




开始
push(val)
minStack 是否为空?
minStack.push(val)
val < minStack.top()?
minStack.push(val)
minStack.push(minStack.top())
dataStack.push(val)
结束


五、复杂度分析

操作 时间复杂度 空间复杂度
push O(1) O(n)
pop O(1) O(n)
top O(1) O(n)
getMin O(1) O(n)

时间复杂度始终保持常数级,空间由于维护辅助栈为线性级。


六、Java 解法代码

下面是实现完整的双栈版本代码:

java 复制代码
class MinStack {
    private Stack<Integer> dataStack;
    private Stack<Integer> minStack;

    public MinStack() {
        dataStack = new Stack<>();
        minStack = new Stack<>();
    }

    public void push(int val) {
        dataStack.push(val);
        if (minStack.isEmpty() || val <= minStack.peek()) {
            minStack.push(val);
        } else {
            minStack.push(minStack.peek());
        }
    }

    public void pop() {
        dataStack.pop();
        minStack.pop();
    }

    public int top() {
        return dataStack.peek();
    }

    public int getMin() {
        return minStack.peek();
    }
}

七、总结

特性 描述
设计思路 用辅助栈同步记录最小值
优点 操作简单,逻辑清晰,性能稳定
缺点 空间使用略多
时间复杂度 O(1)
空间复杂度 O(n)
相关推荐
Doubbbbbbble云24 分钟前
区间合并问题的常见算法模式与优化思路4
java·数据结构·算法
David猪大卫29 分钟前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
hahaha60162 小时前
HLS高层次综合设计技巧--数组
开发语言·嵌入式硬件·算法·fpga开发
不会就选b2 小时前
算法日常・每日刷题--<贪心>10
算法
南京兴帝文化传媒有限公司2 小时前
本地生活服务商户GEO优化技术实践:AI大模型收录机制与地图POI权重算法拆解
大数据·人工智能·算法·生活·geo优化实操·csdn运营技巧·ai内容收录
linx2953 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
布莱克6053 小时前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
shehuiyuelaiyuehao3 小时前
算法44,模拟算法,数青蛙
算法·哈希算法·散列表
hanlin033 小时前
刷题笔记:力扣第287题-寻找重复数
笔记·算法·leetcode
kevin_kang4 小时前
第02章 对话时间线与延迟分析
算法