『LeetCode|每日一题』---->最小栈

目录

每日一句

作者简介

 『LeetCode|每日一题』 最小栈

1.每日一题

2.解题思路 (方法一)

        2.1 思路分析

         2.2 图解

        2.3 完整代码 

        2.4 运行结果 

 3.解题思路(方法二---不利用辅助栈)

        3.1 思路分析

        3.2 完整代码 

        3.3 运行结果


每日一句

风可以吹起一张大白纸,却无法吹走一只蝴蝶,因为生命的力量不在于顺从

作者简介

🏡个人主页:XiaoChen_Android

📚学习专栏:力扣专栏

🕒发布日期:2022/8/20

在这里插入图片描述

 『LeetCode|每日一题』 最小栈

1.每日一题

原文链接--->快看我

2.解题思路 (方法一)

        2.1 思路分析

此题如果定义一个辅助栈处理起来会方便很多,当然也可以不用辅助栈,这里我选择用一个辅助栈

        分析:如果栈里面本来有a,b两个元素,现在又有一个元素c入栈,那么只要当c在栈中时,a和b一定在栈中,利用这个,我们可以定义一个辅助栈,它的作用是存每次元素入栈之后的最小值,元素可以相等。值得注意的是,元素的插入和删除两个栈需同步操作;

        S1:定义两个栈,在MinStack中进行初始化,对于辅助栈,由于是存最小值的,我们可以事先入栈一个很大的值;

        S2:入栈操作push:对于数据栈,直接入栈就好了,但是对于辅助栈,要选择入栈元素和原本辅助栈中的最小值中更小的那个;

        S3:对于出栈,两个栈直接把栈顶元素出栈就好了;

        S4:取栈顶元素但是不出栈:直接在数据栈中peek()就好了,它返回栈顶元素值但是不删除元素;

        S5:取最小值:在辅助栈中取栈顶元素就好了,即minData.peek();

         2.2 图解

        2.3 完整代码 

class MinStack {
    Stack<Integer> data;
    Stack<Integer> minData;

    public MinStack() {
        data = new Stack<>();
        minData = new Stack<>();
        minData.push(Integer.MAX_VALUE);
    }
    
    public void push(int val) {
        data.push(val);
        minData.push(Math.min(val , minData.peek()));
    }
    
    public void pop() {
        data.pop();
        minData.pop();
    }
    
    public int top() {
        return data.peek();
    }
    
    public int getMin() {
        return minData.peek();
    }
}

        2.4 运行结果 

 3.解题思路(方法二---不利用辅助栈)

        3.1 思路分析

        分析:与不利用辅助栈的区别就是,每次入栈的有两个元素,一个是元素本身,另一个是当前栈元素的最小值,举个例子,入栈序列为1,3,0,则入栈后栈中的元素序列为1-1-3-1-0-0;

        S1:对于初始化栈就是有一个栈了,很简单和第一种方法一样

        S2:入栈操作(push):要分情况讨论,如果此时栈是空的,那么直接把该元素两次入栈即可,如果栈不为空,则要先取栈顶元素不删除该元素,就是当前栈元素的最小值,先把该元素入栈,然后和当前栈元素的最小值比较,入栈较小的那个;

        S3:对于pop操作,即对栈进行两次出栈即可;

        S4:要取出当前栈顶的元素且不删除该元素,即要获得stack.size() - 2位置的元素,因为栈顶为当前栈元素最小值;

        S5:对于取最小值,直接去栈顶元素即可

        3.2 完整代码 

class MinStack {
    Stack<Integer> data;

    public MinStack() {
        data = new Stack<>();
    }
    
    public void push(int val) {
        if(data.empty() == true){
            data.push(val);
            data.push(val);
        }else {
            int temp = data.peek();
            data.push(val);
            data.push(Math.min(val , temp));
        }
    }
    
    public void pop() {
        data.pop();
        data.pop();
    }
    
    public int top() {
        return data.get(data.size() - 2);
    }
    
    public int getMin() {
        return data.peek();
    }
}

        3.3 运行结果


🍁 类似题目推荐:

1.数据结构学习计划 

2.算法专项练习

3.剑指offer专项练习

4.推荐一个学习网站:LeetCode,算法的提升在于日积月累,只有每天练习才能保持良好的状态

如果文章对你有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值