最小栈--辅助最小值栈的维护
0x01.问题
设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
push(x)
—— 将元素 x 推入栈中。pop()
—— 删除栈顶的元素。top()
—— 获取栈顶元素。getMin()
—— 检索栈中的最小元素。
示例:
输入: [“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]输出: [null,null,null,null,-3,null,0,-2]
解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top();
–> 返回 0. minStack.getMin();
–> 返回 -2.
提示:
pop
、top
和getMin
操作总是在 非空栈 上调用。
0x02.详细算法思路
我们发现这个最小栈最重要的特征就是 在常数级的时间得到最小值。(这也是这个算法核心)
仔细思考一下,如何才能在常数级别的时间获取最小值?
既然是常数级别的时间,那么这个最小值肯定在其它操作时已经生成了,到具体某一个栈顶元素,只要拿来用就行。
初始的时候,会想到维护一个全局的最小值,根据相应的操作更新就行了。但是,这里就存在一个问题,栈是会不断更新的,如何当前的最小值已经
pop
了,那么,如何去寻找下一个最小值,所以,单一的维护一个最小值,肯定是不行的。既然单一的维护不行,这暗示着我们,需要去维护一个数组级别最小值,这个数组级别应该满足什么特征呢?
- 需要满足,对于每个栈顶元素,都能找到对应的最小值。
也就是说,我们维护的这个数组级别的最小值需要和栈的每个元素相对应,最好的解决办法是什么?
- 没错,就是维护一个辅助栈,对于原栈的每个栈顶元素,辅助栈中对应的元素就是其最小值。
具体辅助栈的维护思路:
- 初始时,辅助栈中放入一个元素
Integer.MAX_VALUE
。目的是避免非空判断。 - 每次进行
push(x)
操作时,对辅助栈的操作是F.push(min{x,F.peek()})
。也就是放入x
和当前栈顶中的最小值,这个维护步骤就是保持两栈始终对应的关键步骤。 - 每次进行
pop()
操作时,两栈同时pop()
。 - 每次进行
getMin()
操作时,返回F.peek()
。
- 初始时,辅助栈中放入一个元素
0x03.解决代码–辅助栈的维护
class MinStack {private Stack<Integer> S=new Stack<>();private Stack<Integer> F=new Stack<>();/** initialize your data structure here. */public MinStack() {F.push(Integer.MAX_VALUE);}public void push(int x) {F.push(Math.min(F.peek(),x));S.push(x);}public void pop() {F.pop();S.pop();}public int top() {return S.peek();}public int getMin() {return F.peek();}
}
ATFWUS --Writing By 2020–05-12
最小栈--辅助最小值栈的维护相关推荐
- 面试题 03.02. 栈的最小值/面试题30. 包含min函数的栈/155. 最小栈
2020-05-10 1.题目描述 栈的最小值 2.题解 需要牺牲空间换时间,可以用vector来存储至当前元素的最小值,在push或者pop元素的时候需要更新. 3.代码 class MinStac ...
- C++的STL栈实现获取栈中最小元素的成员
实现一个获取栈中最小数据成员的函数,该栈支持如下操作: 1.push(x) : 将元素x压入栈中 2.pop() : 弹出(移除)栈顶元素 3.top() : 返回栈顶元素 4.getMin() : ...
- [剑指offer][JAVA]面试题第[30]题[包含min函数的栈][双栈辅助栈][单栈]
[问题描述][中等] 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1).示例:MinStack min ...
- 栈实现:入栈、出栈、取最小元素的时间复杂度都是O(1)。
场景: 实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法.要保证这三个方法的时间复杂度都是O(1). 方法一: 设两个栈A/B,A:存放原始数据,B:栈顶为最小元素 ...
- 面试题 03.02. 栈的最小值
面试题 03.02. 栈的最小值 思路:两个栈,一个存数据,一个存当前最小值 class MinStack { public:stack<int> s1;stack<int> ...
- 每天一算法(二)实现栈的push pop 操作,并可以输出栈的最小值
实现栈的push pop 操作,并可以输出栈的最小值 // SatckMin.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include ...
- T0001.数据结构面试题---栈---获取最小值
题目 实现一个特殊的栈,在实现栈基本功能的基础上,实现返回栈中最小元素的操作. 要求: 1.pop,push,getMin操作的时间复杂度为O(1) 2.可使用现成的栈结构 GitHub源码 GitH ...
- [力扣刷题总结](栈和单调栈篇)
文章目录 ~~~~~~~~~~~~栈~~~~~~~~~~~~ 155. 最小栈 解法1:链表 剑指 Offer 31. 栈的压入.弹出序列 解法1:模拟栈 20. 有效的括号 解法1:栈 相似题目: ...
- 0x11.基本数据结构 — 栈与单调栈
目录 一.栈 0.AcWing 41. 包含min函数的栈 (自己造栈) 1.AcWing 128. 编辑器 (对顶栈) 2.AcWing 129. 火车进栈 3.AcWing 130. 火车进出栈问 ...
最新文章
- Android添加权限大讲解
- “编程能力差!90%输在这点上”谷歌AI专家:其实都是瞎努力!
- IndexedDB 索引数据库
- 网站排名好却没流量到底是什么环节出了问题?
- windows 代理软件_一款强大的远程控制实用软件,分享给你……
- 痞子衡嵌入式:ARM Cortex-M内核那些事(2)- 第一款微控制器
- 前端学习(1185):数据响应式
- 【 HDU - 2594 】Simpsons’ Hidden Talents(KMP应用,求最长前缀后缀公共子串)
- 计算机英语六级,英语六级作文范文:计算机
- RabbitMQ 镜像模式 集群架构 工作最常用集群
- sqlerror.java 1074_java.sql.SQLException: Before start of result set异常
- HDU 2063 过山车
- adobe出的cookbook
- gin 渲染不同目录下的模板(支持多层目录)
- 虚拟服务器+ftp上传错误,虚拟主机FTP无法上传文件解决办法
- [深度学习概念]·主流声学模型对比
- 合生活门禁复制数据结构分析
- 金誉半导体笔记:什么是MCU单片机的SPI、UART、I2C通讯接口
- 网络与社会导论课上所学感悟
- ubuntu idea 卸载