zoukankan      html  css  js  c++  java
  • 力扣刷题-155.最小栈

    155.最小栈

    题目链接:https://leetcode-cn.com/problems/min-stack/submissions/
    设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

    push(x) —— 将元素 x 推入栈中。
    pop() —— 删除栈顶的元素。
    top() —— 获取栈顶元素。
    getMin() —— 检索栈中的最小元素。

    示例:

    输入:
    ["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.
    

    提示:

    pop、top 和 getMin 操作总是在 非空栈 上调用。

    class MinStack {
    
        /** initialize your data structure here. */
        public MinStack() {
    
        }
        
        public void push(int x) {
    
        }
        
        public void pop() {
    
        }
        
        public int top() {
    
        }
        
        public int getMin() {
    
        }
    }
    
    /**
     * 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.getMin();
     */
    

    主函数

     public static void main(String[] args) {
            MinStack minStack = new MinStack();
            minStack.push(-2);
            minStack.push(0);
            minStack.push(-3);
            System.out.println(minStack.getMin());
            minStack.pop();
            System.out.println(minStack.top());
            System.out.println(minStack.getMin());
        }
    

    方法1:使用辅助栈

    执行用时:9 ms

    -定义一个「数据栈」来支持push、pop、top 操作。
    -定义一个「辅助栈」,其栈顶为当前的最小值,以支持常数时间复杂度的getMin操作。

    class MinStack {
    
        /**
         * initialize your data structure here.
         */
    //    解法1--辅助站
        //初始化数据栈和辅助站
        private Stack<Integer> dataStack;//数据栈
        private Stack<Integer> minStack;//辅助栈
    
        public MinStack() {
            dataStack = new Stack<>();
            minStack = new Stack<>();
        }
    //push操作时,需要保持minStack 的栈顶为当前的最小值。
        //peek()查看此堆栈顶部的对象,而不从堆栈中删除它。
        public void push(int x) {
            dataStack.push(x);
            if(minStack.isEmpty()||x<=minStack.peek()){
                minStack.push(x);
            }
        }
    
        /**
         *     如果此次pop的元素是当前的最小值,
         *     则需要将minStack的栈顶元素也pop出。
         *
         */
        public void pop() {
            int x=dataStack.pop();
            if(x==minStack.peek()){
                minStack.pop();
            }
        }
        //返回栈顶元素
        public int top() {
            return dataStack.peek();
        }
        //返回栈顶元素
        public int getMin() {
            return minStack.peek();
        }
    }
    
    
    

    方法2∶使用Stack

    执行用时:7 ms

    -栈元素中除了保存当前值之外,额外保存当前最小值。

    import java.util.Stack;
    
    class MinStack {
    
        //解法二
        private Stack<Node> stack;
    
        //初始化
        public MinStack() {
            stack = new Stack<Node>();
        }
    
        //入栈
        public void push(int x) {
            if (stack.isEmpty()) {
                stack.push(new Node(x, x));
            } else {
                //Math.min(x, stack.peek().min))返回两个int中的较小值
                stack.push(new Node(x, Math.min(x, stack.peek().min)));
            }
        }
    
        //出栈
        public void pop() {
            stack.pop();
        }
    
        //栈顶元素
        public int top() {
            return stack.peek().val;
        }
        //最小元素
        public int getMin(){
            return stack.peek().min;
        }
        //静态内部类是本题解题关键
        private static class Node {
            int val;
            int min;
    
            public Node(int val, int min) {
                this.val = val;
                this.min = min;
            }
        }
    }
    
    

    方法3:自定义Stack

    执行用时:6 ms

    以单链表形式定义栈

     private static class Node{
            int val;
            int min;
            Node next;
    
            public Node(int val, int min) {
                this(val,min,null);
            }
    
            public Node(int val, int min, Node next) {
                this.val = val;
                this.min = min;
                this.next = next;
            }
        }
    
    
    import java.util.Stack;
    
    class MinStack{
        //方法3,自定义Stack
        //以单链表形式定义栈,链表结点定义如下:
        public static class Node{
            int val;
            int min;
            Node next;
    
            public Node(int val, int min) {
                this(val,min,null);
            }
    
            public Node(int val, int min, Node next) {
                this.val = val;
                this.min = min;
                this.next = next;
            }
        }
       
    
        private Node head;//头节点
        public MinStack(){}
        //入栈
        public void push(int x) {
            if(head == null){
                head = new Node(x,x);
            }else{
                head = new Node(x,Math.min(x,head.min),head);
            }
        }
    
        //出栈
        public void pop(){
            head=head.next;
        }
        //栈顶
        public int top(){
            return head.val;
        }
        //最小元素
        public int getMin(){
            return head.min;
        }
    }
    
    

  • 相关阅读:
    iOS蓝牙开发(4.0)详解
    iOS开发--MQTT实时处理数据
    BBWebImage 设计思路
    SDWebImage 加载显示 GIF 与性能问题
    iOS 图片压缩方法
    SDWebImage 加载显示 WebP 与性能问题
    NSTimer、CADisplayLink 内存泄漏
    iOS 使用矢量图
    LeetCode #36 Valid Sudoku
    LeetCode #35 Search Insert Position
  • 原文地址:https://www.cnblogs.com/wanwanyuan/p/14269371.html
Copyright © 2011-2022 走看看