zoukankan      html  css  js  c++  java
  • [LeetCode] 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.

    最小栈,要求getMin()为检索当前stack中的最小值。

    每次添加元素时用minValue来维护一个最小值

    在弹出元素时,如果弹出的是最小元素,则需要在弹出后的stack中找出最小值,因为stack不能遍历,所以使用另一个tmpStack来存储原stack中弹出的每一个值找出最小元素。在将tmpStack中的值再传给原stack中。权当是一个遍历。

    class MinStack {
    public:
        /** initialize your data structure here. */
        MinStack() {
            minValue = INT_MAX;
        }
        
        void push(int x) {
            s.push(x);
            minValue = min(minValue, x);
        }
        
        void pop() {
            int tmp = s.top();
            s.pop();
            if (tmp >= minValue) {
                int minVal = INT_MAX;
                while (!s.empty()) {
                    tmpS.push(s.top());
                    minVal = min(minVal, s.top());
                    s.pop();
                }
                minValue = minVal;
            }
            while (!tmpS.empty()) {
                s.push(tmpS.top());
                tmpS.pop();
            }
            
        }
        
        int top() {
            return s.top();
        }
        
        int getMin() {
            return minValue;
        }
        
    private:
        stack<int> s;
        stack<int> tmpS;
        int minValue;
    };
    // 29 ms
    /**
     * 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();
     */
    class MinStack {
    public:
        /** initialize your data structure here. */
        stack<int> m_data;
        stack<int> m_min;
        MinStack() {
            
        }
        
        void push(int x) {
            m_data.push(x);
            if (m_min.empty() || x < m_min.top())
                m_min.push(x);
            else
                m_min.push(m_min.top());
        }
        
        void pop() {
            m_data.pop();
            m_min.pop();
        }
        
        int top() {
            return m_data.top();
        }
        
        int getMin() {
            return m_min.top();
        }
    };
    
    /**
     * 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();
     */
  • 相关阅读:
    div+css清除浮动代码
    JavaScript for循环实现表格隔行变色
    JavaScript 四种显示数据方式
    table表格隔行变色
    table表格用tbody新属性获取DOM元素
    条形图
    子图--面向对象
    线的形状
    matplotlib--直线和点
    颜色和样式字符串
  • 原文地址:https://www.cnblogs.com/immjc/p/7994639.html
Copyright © 2011-2022 走看看