【力扣】155. 最小栈(Java版)

文章目录

  • [1. 题目](#1. 题目)
  • [2. 题目分析](#2. 题目分析)
  • [3. 代码示例](#3. 代码示例)

1. 题目

在线OJ

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:
· MinStack() 初始化堆栈对象。
· void push(int val) 将元素val推入堆栈。
· void pop() 删除堆栈顶部的元素。
· int top() 获取堆栈顶部的元素。
· int getMin() 获取堆栈中的最小元素。

示例 1:

java 复制代码
输入:
["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.

2. 题目分析

要想要实现在栈里查找最小元素的时间复杂度是O(1),我们容易想到的是在将元素push到栈中的同时,我们定义一个变量来存储这个最小元素,此时在需要获取最小元素的时候,我们的时间复杂度就是O(1)。

接下来将这组数全部放入栈中:

但是如果此时我们对栈进行一次pop操作,就会现在存在一个问题:

现在栈中的最小元素变了,我们无法通过直接获取变量min来获取最小元素了。

所以我们就考虑怎样设计存储最小值,既能实时记录栈中的最小元素,又能直接获取到栈中最小元素的值呢?我们考虑到了使用一个栈来存储这个最小元素。

演示一下存放的步骤:

我们将要push到栈中的元素与最小栈中最顶端的值进行比较,如果要存放的value比它大,那么我们只将value存放在正常栈中就行了。

如果要存放的value比最小栈中最顶端的值小,我们就也需要将value存放在最小栈中,来刷新最小值。

接下来是正常栈pop元素:

如果要在正常栈中pop的元素等于最小栈中顶端元素,那么正常栈pop的同时,最小栈也要pop, 此时就做到了实时更新最小元素。

3. 代码示例

展示一个我犯了令人惭愧的错误的代码:

java 复制代码
class MinStack {

    public Stack<Integer> minStack;
    public Stack<Integer> stack;
    public MinStack() {
        stack = new Stack<>();
        minStack = new Stack<>();
    }

    public void push(int val) {
        stack.push(val);
        if (minStack.empty()){
            minStack.push(val);
        }else {
            if (val <= minStack.peek()){
                minStack.push(val);
            }
        }
    }

    public void pop() {
        if (stack.peek() == minStack.peek()){
            minStack.pop();
            stack.pop();
        }else{
            stack.pop();
        }
        
    }

    public int top() {
        return stack.peek();
    }

    public int getMin() {
        return minStack.peek();
    }
}

这段代码提交之后系统给出的结果是:

下面展示一下正确的代码:

java 复制代码
public class MinStack {
    public Stack<Integer> minStack;
    public Stack<Integer> stack;
    public MinStack() {
        stack = new Stack<>();
        minStack = new Stack<>();
    }

    public void push(int val) {
        stack.push(val);
        if (minStack.empty()){
            minStack.push(val);
        }else {
            if (val <= minStack.peek()){
                minStack.push(val);
            }
        }
    }

    public void pop() {
        int val = stack.pop();
        if (val == minStack.peek()){
            minStack.pop();
        }
    }
    
    public int top() {
        return stack.peek();
    }

    public int getMin() {
        return minStack.peek();
    }
}

其实错误代码和正确代码不同的地方就是pop方法的写法,看着第一个pop方法的逻辑没有什么错误,但是犯了一个致命的错误,if (stack.peek() == minStack.peek()){这里获取到的Integer类型的数据,它是引用,引用是不能直接使用==来进行比较的。

第二个pop方法中是先获取了val,此时val是int类型的,在进行比较时,会进行自动拆箱的操作,所以能够进行比较。但是第一个pop方法是引用类型,比较的是地址。

其实这个错误之前我的老师强调过很多次,我在自己写一个新题目的时候还是犯了这个错误,自己看了很久,想了很久,也进行了调试都没有想明白,最后还是问了我的老师,老师说完真是感觉恍然大悟,然后紧接着的就是感到惭愧,真是学艺不精啊🙃继续努力吧,道阻且长🤦‍♀️

写这篇题目的博客也是想让自己牢记这个错误,最后,我要感谢我的老师❤️

相关推荐
萝卜白菜。14 分钟前
TongWeb7.0相同的类指明加载顺序
开发语言·python·pycharm
wb0430720115 分钟前
使用 Java 开发 MCP 服务并发布到 Maven 中央仓库完整指南
java·开发语言·spring boot·ai·maven
Rsun0455116 分钟前
设计模式应该怎么学
java·开发语言·设计模式
汀、人工智能20 分钟前
[特殊字符] 第2课:字母异位词分组
数据结构·算法·链表·数据库架构··字母异位词分组
良木生香33 分钟前
【C++初阶】:C++类和对象(下):构造函数promax & 类型转换 & static & 友元 & 内部类 & 匿名对象 & 超级优化
c语言·开发语言·c++
5系暗夜孤魂38 分钟前
系统越复杂,越需要“边界感”:从 Java 体系理解大型工程的可维护性本质
java·开发语言
二月夜1 小时前
Spring循环依赖深度解析:从三级缓存原理到跨环境“灵异”现象
java·spring
小O的算法实验室1 小时前
2026年SEVC,面向主动成像卫星任务规划问题的群体智能与动态规划混合框架,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
网安INF1 小时前
数据结构第一章复习:基本概念与算法复杂度分析
数据结构·算法
无巧不成书02181 小时前
C语言零基础速通指南 | 1小时从入门到跑通完整项目
c语言·开发语言·编程实战·c语言入门·零基础编程·c语言速通