一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情。
前言
力扣第155题 最小栈 如下所示:
一、思路
题目很简单,就是实现一个自定义栈,可以快速的找到栈中最小的元素。我刚开始想的是用一个临时变量来存储当前栈中最小的值,这样虽然能保证在 push 完获得最小的值,但是在 pop 弹出栈顶后就无法知道栈中的最小值了。
为了改变上诉的情况,我们可以使用一个链表来存储 当前栈中最小的元素,这种思路也被称为 辅助栈
辅助栈
辅助栈中存的为对应大小栈中的最小值
此处以示例一作为例子分析
- 第一次入栈
第一次入栈,栈中只有一个元素-2,故当前栈中最小值为 -2,故将 -2 压入辅助栈
- 第二次入栈,与第一步同理
- 第三次入栈,
此时栈出现了更小的值 -3,故将 -3 压入辅助栈
- 获取最小值?
最小值就是辅助栈的栈顶,读取栈顶的元素即可(不出栈)
- 第一次出栈
出栈时只需要将主栈和辅助栈的栈顶元素都移除即可
- 再次获取最小值
此时栈中元素的最小值为 -2,直接返回辅助栈中的栈顶元素即可。
综上所述,我们只需要将辅助栈中的元素与主栈元素一一对应,且辅助栈中存储当前栈中的最小值即可。这样不管是入栈、出栈都很容易处理,在获得栈最小值时都不需要计算即可得到。
二、实现
实现代码
实现代码与思路中保持一致
/**
* 链表
*/
LinkedList<Integer> list = new LinkedList<>();
LinkedList<Integer> miniList = new LinkedList<>();
Integer miniVal = null;
public MinStack() {
}
/**
* 入栈
*/
public void push(int val) {
list.push(val);
if (miniVal == null){
miniVal = val;
}else if (val < miniVal){
miniVal = val;
}
miniList.push(miniVal);
}
/**
* 删除栈顶
*/
public void pop() {
int val = list.pop();
miniList.pop();
if (val == miniVal)
miniVal = miniList.peek();
else if (list.size() == 0)
miniVal = null;
}
/**
* 获取栈顶
*/
public int top() {
return list.peek();
}
/**
* 获取栈最小元素
* @return
*/
public int getMin() {
return miniList.peek();
}
测试代码
测试代码太长了,就截个图看一下吧
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~