zoukankan      html  css  js  c++  java
  • 【剑指Offer】面试题30. 包含min函数的栈

    题目

    定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

    示例:

    MinStack minStack = new MinStack();
    minStack.push(-2);
    minStack.push(0);
    minStack.push(-3);
    minStack.min();   --> 返回 -3.
    minStack.pop();
    minStack.top();   --> 返回 0.
    minStack.min();   --> 返回 -2.
    

    提示:

    • 各函数的调用总次数不超过 20000 次

    本题同【LeetCode】155. 最小栈

    思路

    把每次的最小值(之前最小值和新压入栈元素较小者)都保存在辅助栈中。辅助栈的栈顶元素永远保存当前最小值。

    • 如果新压入栈元素小于辅助栈栈顶元素,则将该元素压入辅助栈;
    • 否则,再次将栈顶元素压入辅助栈。

    代码

    class MinStack {
        stack<int> st;
        stack<int> st_min;
    public:
        /** initialize your data structure here. */
        MinStack() {
    
        }
        
        void push(int x) {
            st.push(x);
            if (!st_min.empty() && st_min.top() < x) {
                st_min.push(st_min.top());
            } else {
                st_min.push(x);
            }        
        }
        
        void pop() {
            st.pop();
            st_min.pop();
        }
        
        int top() {
            return st.top();
        }
        
        int min() {
            return st_min.top();
        }
    };
    

    另一种写法

    如果当前元素大于栈顶元素,则不压入(节省一定空间),而在上一种方法中则重复压入最小栈栈顶元素(节省弹出时间)。

    class MinStack {
        stack<int> st;
        stack<int> st_min;
    public:
        /** initialize your data structure here. */
        MinStack() {
    
        }
        
        void push(int x) {
            st.push(x);
            if (st_min.empty() || st_min.top() >= x) {
                st_min.push(x);
            }     
        }
        
        void pop() {
            if (st.top() == st_min.top()) st_min.pop();
            st.pop();     
        }
        
        int top() {
            return st.top();
        }
        
        int min() {
            return st_min.top();
        }
    };
    
  • 相关阅读:
    08 正则表达式
    07 函数&对象
    06 Math&Date&Json
    05 数组&字符串
    04 循环控制
    03 流程控制
    02 数据类型&运算符
    大道至简
    Avg_row_length是怎么计算的?
    理解innodb buffer pool
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/12458871.html
Copyright © 2011-2022 走看看