力扣第155题-最小栈

539 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情

前言

力扣第155题 最小栈 如下所示:

image.png

一、思路

题目很简单,就是实现一个自定义栈,可以快速的找到栈中最小的元素。我刚开始想的是用一个临时变量来存储当前栈中最小的值,这样虽然能保证在 push 完获得最小的值,但是在 pop 弹出栈顶后就无法知道栈中的最小值了。

为了改变上诉的情况,我们可以使用一个链表来存储 当前栈中最小的元素,这种思路也被称为 辅助栈

辅助栈

辅助栈中存的为对应大小栈中的最小值

此处以示例一作为例子分析

  1. 第一次入栈

第一次入栈,栈中只有一个元素-2,故当前栈中最小值为 -2,故将 -2 压入辅助栈

image.png

  1. 第二次入栈,与第一步同理

image.png

  1. 第三次入栈,

此时栈出现了更小的值 -3,故将 -3 压入辅助栈

image.png

  1. 获取最小值?

最小值就是辅助栈的栈顶,读取栈顶的元素即可(不出栈)

image.png

  1. 第一次出栈

出栈时只需要将主栈和辅助栈的栈顶元素都移除即可

image.png

  1. 再次获取最小值

此时栈中元素的最小值为 -2,直接返回辅助栈中的栈顶元素即可。

image.png

综上所述,我们只需要将辅助栈中的元素与主栈元素一一对应,且辅助栈中存储当前栈中的最小值即可。这样不管是入栈、出栈都很容易处理,在获得栈最小值时都不需要计算即可得到。

二、实现

实现代码

实现代码与思路中保持一致

/**
 * 链表
 */
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();
}

测试代码

测试代码太长了,就截个图看一下吧

image.png

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~