当前位置:网站首页>设计一个有getMin功能的栈
设计一个有getMin功能的栈
2022-06-28 13:46:00 【华为云】
设计一个有getMin功能的栈
【题目】
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
【要求】
1.pop、push、getMin操作的时间复杂度都是O(1)。
2.设计的栈类型可以使用现成的栈结构。
【思路】
使用两个栈,一个栈a正常的进出,另外一个栈b用来维护最小值,时刻保持b栈的栈顶是当前a栈中的最小值。
方法一【两栈深度不一致】:入栈时,每次入a栈的时候,如果b栈为空,入a栈同时进入b栈,如果入a栈的值比b栈顶大,则不入,反之,进入b栈,更新最小值;出栈时,如果出栈值等于b栈顶,就把b栈顶也出了,更新最小值,反之,b栈不更新。
举例:依次压入3、4、5、1、2、1的过程中,stackData(a)和stackMin(b)的变化如下图所示。
说明:图片来自左神的程序代码面试指南,仅供学习使用。

方法二【两栈深度保持一致】:入栈时,进入a栈时,如果b栈为空,进入b栈,如果b栈不为空且b栈栈顶小于a栈新入栈的值,那么把b栈的栈顶再次入b栈,高度保持一致;出栈时,两个栈同时弹出。
举例:依次压入3、4、5、1、2、1的过程中,stackData(a)和stackMin(b)的变化如下图所示。

【代码】
【Java】
方法一:
package keafmd.accumulate.codeinterviewguide.stackwithgetmin;import java.util.Stack;/** * Keafmd * * @ClassName: getMinStack * @Description: 有最小值的栈 * @author: 牛哄哄的柯南 * @date: 2022-06-20 14:29 */public class MyStack1 { private Stack<Integer> stacka; private Stack<Integer> stackb; public MyStack1(){ stacka = new Stack<>(); stackb = new Stack<>(); } //入栈 public void push(Integer val){ stacka.push(val); if(stackb.isEmpty()||val<=getMin()){ stackb.push(val); } } //出栈 public Integer pop(){ if(stacka.isEmpty()){ throw new RuntimeException("Stack is empty!"); } Integer val = stacka.pop(); if(val.equals(getMin())){ stackb.pop(); } return val; } //获取最小值 public Integer getMin(){ if(stackb.isEmpty()){ throw new RuntimeException("Stack is empty!"); } return stackb.peek(); }}方法二:
package keafmd.accumulate.codeinterviewguide.stackwithgetmin;import java.util.Stack;/** * Keafmd * * @ClassName: MyStack2 * @Description: 有最小值的栈 * @author: 牛哄哄的柯南 * @date: 2022-06-20 15:07 */public class MyStack2 { private Stack<Integer> stacka; private Stack<Integer> stackb; public MyStack2(){ stacka = new Stack<>(); stackb = new Stack<>(); } //入栈 public void push(Integer val){ stacka.push(val); if(stacka.isEmpty()||val<getMin()){ stackb.push(val); }else{ stackb.push(getMin()); } } //出栈 public Integer pop(){ if(stacka.isEmpty()){ throw new RuntimeException("Stack is empty!"); } Integer val = stacka.pop(); stackb.pop(); return val; } //获取最小值 public Integer getMin(){ if(stackb.isEmpty()){ throw new RuntimeException("Stack is empty!"); } return stackb.peek(); }}【总结】
方法一和方法二其实都是用 stackb 栈保存着 stacka 每一步的最小值。共同点是所有操作的时间复杂度都为O(1)、空间复杂度都为O(n)。区别是:方法一中stackb压入时稍省空间,但是弹出操作稍费时间;方法二中stackb压入时稍费空间,但是弹出操作稍省时间。
边栏推荐
- My hematemesis collection integrates script teaching from various classic shell books. As Xiaobai, come quickly
- Hundreds of lines of code to implement a JSON parser
- Class structure in C language - dot
- Solution to directory access of thinkphp6 multi-level controller
- 坐拥755万开发者的中国开源,进度几何?
- 2.01 backpack problem
- N皇后问题
- PHP gets the number of digits and replaces it with the specified mantissa
- 黑苹果安装教程OC引导「建议收藏」
- (original) [Maui] realize "floating action button" step by step
猜你喜欢

Jupyter notebook中添加虚拟环境

Kubernetes 深入理解Kubernetes(二) 声明组织对象

Oracle 云基础设施扩展分布式云服务,为组织提供更高的灵活性和可控性

Hematemesis recommends 17 "wheels" to improve development efficiency

坐拥755万开发者的中国开源,进度几何?

PCB懂王,你是吗?我不是

895. longest ascending subsequence

Inftnews | technology giants accelerate their march into Web3 and metauniverse

(原创)【MAUI】一步一步实现“悬浮操作按钮”(FAB,Floating Action Button)

The company leader said that if the personal code exceeds 10 bugs, he will be dismissed. What is the experience?
随机推荐
Latest summary! 30 provinces announce 2022 college entrance examination scores
CVPR再起争议:IBM中稿论文被指照搬自己承办竞赛第二名的idea
go数组与切片,[]byte转string[通俗易懂]
抢做意大利岛主?刘强东两月套现66亿 疑一次性5.6亿“紧急转账”急购欧洲海上皇宫
Double buffer drawing
How to set auto format after saving code in vscade
《畅玩NAS》家庭 NAS 服务器搭建方案「建议收藏」
PostgreSQL超越MySQL
决策树预测红酒品质
MySQL多表联合查询
How to display the server list of the electric donkey, and how to update the eMule server list
php获取数字的个位数并替换为指定的尾数
股票网上开户及开户流程怎样?手机开户是安全么?
[机缘参悟-32]:鬼谷子-抵巇[xī]篇-面对危险与问题的五种态度
几百行代码实现一个 JSON 解析器
To be the Italian Islander? Liuqiangdong cashed out 6.6 billion yuan in two months and made a one-time 560million "emergency transfer" to buy the European maritime Palace
(original) [Maui] realize "floating action button" step by step
恒生电子:金融分布式数据库LightDB通过中国信通院多项测评
Build a learning environment
StackOverflow 2022数据库年度调查