力扣-155:最小栈(JAVA实现)

前言:

      在力扣上关于最小栈的问题,看到一个非常聪明简单的栈设计,和大家分享一下。

原题目描述:

原题链接:155. 最小栈 - 力扣(LeetCode)

 解题思路:

容器设计:

   由于该栈要求我们能检索出栈中的最小元素,如果使用最原始的栈设计,我们在取最小值时,需要依次从栈顶开始往栈底遍历去找,可以解出题目,但是显然不够聪明,所以我们设计这个栈时,选用单链表来存储元素,并且在每个节点中添加一个属性来保存最小值:

//自定义Node,用min存放最小值
    private class Node{
        int val;     //保存当前元素的值
        int min;     //保存最小值
        Node next;   //保存指向的下一个节点

        //自定义Node的构造方法
        private Node(int val,int min){
            this.val = val;
            this.min = min;
            this.next = null;
        }

        private Node(int val,int min,Node next){
            this.val = val;
            this.min = min;
            this.next = next;
        }
    }
 PUSH方法:

根据上述设计,思路就是在向栈中push元素时,我们都将目前栈中的最小值与当前要push的元素值进行比较,如果当前元素值更小,则使当前元素变成头结点的同时将最小值保存到头结点的min属性:

public void push(int val) {
        if(head == null){
            //第一次压入元素时,val值即为最小值
            head = new Node(val,val);
        }else{
            //将最小值赋值给head节点的min
            head = new Node(val,Math.min(val, head.min),head);
        }
    }
完整代码:
public class LeetCode_155 {

    private Node head;

    public void push(int val) {
        if(head == null){
            head = new Node(val,val);
        }else{
            head = new Node(val,Math.min(val, head.min),head);
        }
    }

    public void pop() {
        head = head.next;
    }

    public int top() {
        return head.val;
    }

    public int getMin() {
        return head.min;
    }
    //自定义Node,用min存放最小值
    private class Node{
        int val;
        int min;
        Node next;
        //自定义Node的构造方法
        private Node(int val,int min){
            this.val = val;
            this.min = min;
            this.next = null;
        }

        private Node(int val,int min,Node next){
            this.val = val;
            this.min = min;
            this.next = next;
        }
    }
}
优化点:

    由于我们每次压入元素时都更新了head的最小值,所以在取最小值时,我们只需要返回head节点的min即可,相比最简单的栈节省了遍历的时间,效率很高。

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值