• 155. Min Stack


    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.

    M1: 用两个stack,s1 push 当前元素,s2同步 push 当前最小值,pop也同步

    push(), pop(), top(), getMin()  -- time: O(1), space: O(n)

    class MinStack {
        LinkedList<Integer> stack;
        LinkedList<Integer> minStack;
    
        /** initialize your data structure here. */
        public MinStack() {
            stack = new LinkedList<>();
            minStack = new LinkedList<>();
        }
        
        public void push(int x) {
            stack.push(x);
            if(minStack.isEmpty()) {
                minStack.push(x);
            } else {
                minStack.push(Math.min(x, minStack.peek()));
            }
        }
        
        public void pop() {
            stack.pop();
            minStack.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();
     */

    M2: 用一个stack,常数global min存最小值

    push: 如果当前元素会改变global min,先push一个旧的global min, 更新global min,再把当前元素入栈

    pop: 如果pop出的元素 = global min,再pop一次,global min = 第二次pop的数,即旧的global min

    class MinStack {
        LinkedList<Integer> s;
        int globalMin;
    
        /** initialize your data structure here. */
        public MinStack() {
            s = new LinkedList<>();
            globalMin = Integer.MAX_VALUE;
        }
        
        public void push(int x) {
            if(x <= globalMin) {
                s.push(globalMin);
                globalMin = x;
            }
            s.push(x);
        }
        
        public void pop() {
            if(s.pop() == globalMin) {
                globalMin = s.pop();
            }
        }
        
        public int top() {
            return s.peek();
        }
        
        public int getMin() {
            return globalMin;
        }
    }
    
    /**
     * 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();
     */

    M3: 用两个stack,有大量重复元素的时候,s2可以存这样的pair <val, s1.size()> ,节约空间

    class MinStack {
        LinkedList<Integer> stack;
        LinkedList<int[]> minStack;
    
        /** initialize your data structure here. */
        public MinStack() {
            stack = new LinkedList<>();
            minStack = new LinkedList<>();
        }
        
        public void push(int x) {
            stack.push(x);
            if(minStack.isEmpty()) {
                minStack.push(new int[] {x, stack.size()});
            } else {
                if(x < minStack.peek()[0]) {
                    minStack.push(new int[] {x, stack.size()});
                }
            }
        }
        
        public void pop() {
            if(stack.size() == minStack.peek()[1]) {
                stack.pop();
                minStack.pop();
            } else {
                stack.pop();
            }
        }
        
        public int top() {
            return stack.peek();
        }
        
        public int getMin() {
            return minStack.peek()[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();
     */
  • 相关阅读:
    二十四 多重继承
    二十三 使用@property
    Tornado 协程
    基于协程的Python网络库gevent
    用greenlet实现Python中的并发
    在Nginx上配置多个站点
    python 使用Nginx和uWSGI来运行Python应用
    在Apache中运行Python WSGI应用
    Python打包分发工具setuptools
    Python 远程部署 Fabric
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10223245.html
Copyright © 2020-2023  润新知