zoukankan      html  css  js  c++  java
  • leetcode 155. Min Stack --------- java

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

    • push(x) -- Push element x onto stack.
    • pop() -- Removes the element on top of the stack.
    • top() -- Get the top element.
    • getMin() -- Retrieve the minimum element in the stack.

    Example:

    MinStack minStack = new MinStack();
    minStack.push(-2);
    minStack.push(0);
    minStack.push(-3);
    minStack.getMin();   --> Returns -3.
    minStack.pop();
    minStack.top();      --> Returns 0.
    minStack.getMin();   --> Returns -2.


    设计一个可以获得最小值的栈。

    第一次用了ArrayList和Stack,超时了。

    public class MinStack {
    
        Stack<Integer> stack ;
        ArrayList<Integer> list;
        public MinStack() {
            stack = new Stack<Integer>();
            list = new ArrayList<Integer>();
        }
    
        public void push(int x) {
            stack.push(x);
            int flag = 0;
            if( list.size() == 0 ){
                list.add(x);
                return ;
            }
            for( int i = 0 ; i < list.size() && flag == 0;i++){
                if( list.get(i) > x ){
                    list.add(i,x);
                    flag = 1;
                }
            }
            if( flag == 0)
                list.add(list.size(),x);
            
    
        }
    
        public void pop() {
    
            list.remove((Integer) stack.pop());
        }
    
        public int top() {
            return stack.peek();
        }
    
        public int getMin() {
            return list.get(0);
        }
    }
    
    /**
     * 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();
     */

    只使用一个ArrayList

    public class MinStack {
    
        ArrayList<Integer> list;
        int min ;
        public MinStack() {
            list = new ArrayList<Integer>();
        }
    
        public void push(int x) {
            list.add(x);
            if( list.size() == 1)
                min = x;
            else
                min = Math.min(min,x);
        }
    
        public void pop() {
            list.remove( list.size()-1 );
            if( list.size() == 0)
                return ;
            min = list.get(0);
            for( int i = 1 ; i < list.size();i++)
                min = Math.min(min,list.get(i));
    
        }
    
        public int top() {
            return list.get(list.size()-1);
        }
    
        public int getMin() {
            return min;
        }
    }
    
    /**
     * 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();
     */

    3、使用两个栈实现。

    public class MinStack {
    
        private Stack<Integer> stack = new Stack<Integer>();  
        // minStack: store the current min values  
        private Stack<Integer> minStack = new Stack<Integer>();  
      
        public void push(int x) {  
            // store current min value into minStack  
            if (minStack.isEmpty() || x <= minStack.peek())  
                minStack.push(x);  
            stack.push(x);  
        }  
      
        public void pop() {  
            // use equals to compare the value of two object, if equal, pop both of them  
            if (stack.peek().equals(minStack.peek()))  
                minStack.pop();  
            stack.pop();  
        }  
      
        public int top() {  
            return stack.peek();  
        }  
      
        public int getMin() {  
            return minStack.peek();  
        }
    }
    
    /**
     * 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();
     */

    4、也可以只用一个栈实现。

    public class MinStack {
        long min;
        Stack<Long> stack;
    
        public MinStack(){
            stack=new Stack<>();
        }
        
        public void push(int x) {
            if (stack.isEmpty()){
                stack.push(0L);
                min=x;
            }else{
                stack.push(x-min);//Could be negative if min value needs to change
                if (x<min) min=x;
            }
        }
    
        public void pop() {
            if (stack.isEmpty()) return;
            
            long pop=stack.pop();
            
            if (pop<0)  min=min-pop;//If negative, increase the min value
            
        }
    
        public int top() {
            long top=stack.peek();
            if (top>0){
                return (int)(top+min);
            }else{
               return (int)(min);
            }
        }
    
        public int getMin() {
            return (int)min;
        }
    }

    5、不用栈实现。

    class MinStack {
        private Node head;
        
        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;
        }
        
        private class Node {
            int val;
            int min;
            Node next;
            
            private Node(int val, int min) {
                this(val, min, null);
            }
            
            private Node(int val, int min, Node next) {
                this.val = val;
                this.min = min;
                this.next = next;
            }
        }
    }
  • 相关阅读:
    docker 启动redis
    mysql主从库搭建
    云镜象下载地址整理
    linux 命令积累
    canal 踩坑实录---这可能是你看到的最全最简单的canal教程
    数据库查询超级慢,数据库死锁的查看与解决
    微信公众平台开发---建立服务器与微信公众平台的链接
    使用sql更改表的列的数据类型和添加新列和约束
    Mac安装、配置MongoDB
    shell 变量
  • 原文地址:https://www.cnblogs.com/xiaoba1203/p/6080701.html
Copyright © 2011-2022 走看看