
[LintCode] Min Stack 最小栈
发布日期:2025-04-06 01:23:19
浏览次数:15
分类:精选文章
本文共 1036 字,大约阅读时间需要 3 分钟。
实现一个支持min()功能的堆栈
问题描述
我们需要设计一个堆栈数据结构,支持push、pop和min三个操作,且每个操作的时间复杂度为O(1)。这些操作分别是将元素压入堆栈、弹出堆栈顶部的元素以及获取堆栈中的最小值。为了实现这一目标,我们需要巧妙地利用堆栈的特性,同时维护一个辅助结构来记录最小值。
方法一:使用两个堆栈
我们可以使用两个堆栈来实现这个目标。主要堆栈(m1)负责存储所有元素,辅助堆栈(m2)负责存储当前堆栈中的最小值。具体实现如下:
push操作:
- 将元素压入m1。
- 如果m2为空或m2的顶部元素大于等于当前元素,将其压入m2。
pop操作:
- 弹出m1的顶部元素t。
- 如果m2不为空且m2的顶部元素等于t,则弹出m2的顶部元素。
min操作:
- 如果m2不为空,则返回m2的顶部元素作为最小值。
这种方法确保了在push和pop操作时,辅助堆栈m2始终记录当前堆栈中的最小值,从而实现了O(1)时间复杂度的min操作。
方法二:使用最小值变量
另一种实现方式是使用一个变量mn来记录当前堆栈中的最小值。具体实现如下:
push操作:
- 如果当前元素小于mn,则将mn压入辅助堆栈s,并更新mn为当前元素。
- 将当前元素压入辅助堆栈s。
pop操作:
- 弹出辅助堆栈s的顶部元素t。
- 如果t等于mn,则更新mn为辅助堆栈s的新顶部元素。
min操作:
- 直接返回mn作为最小值。
这种方法通过维护一个辅助变量来记录最小值,避免了额外的堆栈操作,实现了O(1)时间复杂度的min操作。
边界条件与测试
在实际应用中,需要考虑以下边界条件:
空堆栈:根据题目要求,min操作不会在堆栈为空时被调用,因此无需处理这种情况。
重复元素:当堆栈中包含多个相同的元素时,min操作应正确返回其中一个。
弹出操作:在弹出元素时,可能导致辅助堆栈的最小值发生变化,需要相应更新。
通过上述两种方法,我们可以实现一个支持push、pop和min操作的堆栈,且每个操作的时间复杂度均为O(1)。选择哪种方法取决于具体需求和实现偏好。
示例测试
push(1)pop()
:返回1push(2)push(3)min()
:返回2push(1)min()
:返回1
这些测试用例验证了两种方法的正确性,确保在各种情况下min操作返回堆栈中的最小值。
结论
通过以上分析,我们可以明确选择一种适合的实现方法,并确保在各种测试用例下都能正确工作。这种设计既简洁又高效,是解决类似问题的典型方法。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年05月08日 20时14分39秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux Terminator
2025-04-06
linux tex文件编译,用latexmk编译XeLaTeX tex文件
2025-04-06
linux thinkphp 目录 [ ./Runtime/ ] 不可写!
2025-04-06
Linux top
2025-04-06
Linux top 命令详解
2025-04-06
Linux tr命令学习笔记与应用举例
2025-04-06
Linux Ubuntu 装LAMP心得
2025-04-06
linux Ubuntu安装ftp并将本地文件上传到云服务器
2025-04-06
linux udev 自动挂载 SD卡/U盘
2025-04-06
Linux UDP C/S例子
2025-04-06
Linux uniq学习笔记
2025-04-06
Linux unit14
2025-04-06
Linux VFS中write系统调用实现原理【转】
2025-04-06
Linux VI command
2025-04-06
linux vim 插件
2025-04-06
Linux vim 操作大集合,Linux运维工程师收藏!
2025-04-06
Linux vim编辑器
2025-04-06
LINUX weblogic集群搭建- 03启动脚本的控制
2025-04-06
Linux wget 下载 文件到指定目录
2025-04-06
linux who命令实现,用标准IO实现linux的who命令
2025-04-06