剑指 Offer 30. 包含min函数的栈 思路分析和代码

        思路如下: 题中要求min、push、和pop的时间复杂度都要为O(1),就不能使用遍历找出最小值了。所以需要想办法在加入元素的时候记录min。因为不知道存入多少个,还需要搞一个数组扩容命令。

        我最初的代码是计划使用一个数组动态规划的形式记录每一位的min值,新加入的时候与min【temp-1】比较,如果比它小 min【temp】=arr【temp】,否则min【temp】=arr【temp-1】.

        后来发现题解中有一个更加聪明的记录方法。使用主栈A<Integer>,创建另一个栈B,新加入一个元素,可以将其与栈B中上一个元素进行比较,如果大于上一个元素,就不用加入B了,因为肯定不是当前元素中最小的。

        如果小于等于(注意!等于也要加入,否则pop时就出错了)上一个元素(这个是加入前栈A中最小的元素),说明当前栈A中最小的元素就是这个新元素。就加入B。pop弹出的时候,比较弹出的元素是不是与栈B顶部元素equals相等。如果相等就pop B顶部元素。否则就不弹出。

class MinStack {

    /** initialize your data structure here. */
    int[] arr = new int[5];
    int temp=-1;
    int mins[]= new int[5];
    public void addMaxLength(){
        arr=Arrays.copyOf(arr,arr.length*2);
         mins=Arrays.copyOf(mins,mins.length*2);
    }
    public MinStack() {
        
    }
    
    public void push(int x) {
        if(temp==arr.length-1){
            addMaxLength();
        }
        arr[++temp]=x;
        if(temp==0){
           mins[0]=arr[temp];
        }else{
            if(arr[temp]<mins[temp-1]){
                mins[temp]=arr[temp];
            }else{
                mins[temp]=mins[temp-1];
            }
        }
    }
    
    public void pop() {
        if(temp<0){
            //空栈 
            return;
        }
        temp--;
    }
    
    public int top() {
        if(temp<0){
             throw new RuntimeException ("空栈");
        }
       return arr[temp];


    }
    
    public int min() {
            return mins[temp];
    }
}

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值