Leetbook作业记录:最小栈


前言

记录一下自己的学习历程。说实话这是我第一次动手实现一个栈,一般我们都是等别人实现了拿着应用来给我们看的,其实还是自己动手好玩一些。


一、解题思路

这道题其实实现栈很容易,抄一下官方给的模板就好,但是要实现最小栈,MinStack这个类需要有一个最小值的属性。我一开始也只是照顾到push的过程最小值的更新,但是没有照顾到pop的过程中最小值也需要更新,所以第一次执行时候getMin的值是错误的。修改起来倒也不难。

有一个地方要注意,就是最小值属性一开始并不能设置为空,因为最小值是int类型的变量,null无法转变成int。这个问题我们可以根据题目给出的val的范围来解决,所以最小值的初始值是-2^31。

二、作业记录

1.作业代码(java)

代码如下:

class MinStack {

    /** initialize your data structure here. */
    private List<Integer> data;
    private int min;

    public MinStack() {
        data = new ArrayList<>();
        min = -2147483648;
    }
    
    public void push(int val) {
        data.add(val);
        if(min == -2147483648){
            min = val;
        }else if( val < min){
            min = val;
        }
    }
    
    public void pop() {
        if(!data.isEmpty()){
            data.remove(data.size()-1);
        }
        min = -2147483648;
        int val, i;
        for(i = 0; i < data.size();i++){
            val = data.get(i);
            if(min == -2147483648){
               min = val;
            }else if( val < min){
               min = val;
            }
        }
    }
    
    public int top() {
        return data.get(data.size()-1);
    }
    
    public int getMin() {
        return min;
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

2.运行结果

结果如下:
在这里插入图片描述
似乎这样很慢啊。看来有必要优化一下代码,我认为问题应该是在pop函数重置最小值的运算量太大了。

优化的思路:因为每次栈就是从栈顶弹出一个元素,那么如果在push的时候记录每一个元素入栈时对应的栈的最小值,在pop的时候重置最小值就方便啦。于是将min也改成ArrayList。

3.优化后的作业代码(java)

class MinStack {

    /** initialize your data structure here. */
    private List<Integer> data;
    private List<Integer> min;

    public MinStack() {
        data = new ArrayList<>();
        min = new ArrayList<>();

    }
    
    public void push(int val) {
        if(data.size() == 0){
            data.add(val);
            min.add(val);
        }else{
            int preMin;
            data.add(val);
            preMin = min.get(data.size()-2);
            if( preMin <= val){
                min.add( data.size()-1,preMin);
            }else{
                min.add( data.size()-1, val);
            }
        } 
    }
    
    public void pop() {
    
        if(!data.isEmpty()){
            min.remove(data.size()-1);
            data.remove(data.size()-1);
        }
    }
    
    public int top() {
        return data.get(data.size()-1);
    }
    
    public int getMin() {
        return min.get(data.size()-1);
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

4.优化后的作业表现

在这里插入图片描述
用时方面改善了很多。


总结

既要考虑push操作时的最小值更新,也要考虑pop操作时的最小值更新,要让自己考虑问题时更加全面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不争之德

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值