• [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();
     */
  • 相关阅读:
    NO 3 ,人生苦短,我学python之python 元祖tuple魔法
    NO 2,人生苦短,我学python之python 列表list的魔法
    NO 1,人生苦短,我学python之python 字符串的魔法
    几种常见登录验证的方式总结
    Spring Boot 解决跨域问题的 3 种方案
    浅析VO、DTO、DO、PO的概念、区别和用处
    对于分库分表的入门理解
    在项目启动后执行某段功能代码
    jna编程学习
    RabbitMQ详解
  • 原文地址:https://www.cnblogs.com/immjc/p/7994639.html
Copyright © 2020-2023  润新知