《剑指offer》面试题30. 包含min函数的栈
阅读原文时间:2023年07月09日阅读:1

问题描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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 次

代码

使用两个栈,一个用来存数据,一个用来存最小元素

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> st1,st2;
    MinStack() {

    }

    void push(int x) {
        st1.push(x);
        if(st2.empty() || x <= st2.top())//注意不能只是小于
            st2.push(x);
    }

    void pop() {
        if(st1.top() == st2.top())
            st2.pop();
        st1.pop();

    }

    int top() {
        return st1.top();
    }

    int min() {
        return st2.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->min();
 */

结果

执行用时 :80 ms, 在所有 C++ 提交中击败了7.98%的用户
内存消耗 :15.1 MB, 在所有 C++ 提交中击败了100.00%的用户

代码

使用一个栈来存数据,使用minval来存最小元素,值得注意的是push和pop操作,在push中如果遇到的元素x比当前最小元素小,要把当前最小元素入栈,再加入新的元素x,在pop操作中,如果要删除的元素恰好是当前最小元素,则需要从栈中删除两个元素,其中第二个元素为新的最小元素。

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> st1;
    int minval;
    MinStack() {
         minval = INT_MAX;
    }

    void push(int x) {
        if(x <= minval)
        {
            st1.push(minval);//这是最重要一步,记录原先最小的元素
            minval = x;
        }
        st1.push(x);
    }

    void pop() {
        int n = st1.top();
        st1.pop();
        if(n == minval)
        {
            minval = st1.top();
            st1.pop();
        }
    }

    int top() {
        return st1.top();
    }

    int min() {
        return minval;
    }
};

/**
 * 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->min();
 */

结果

执行用时 :56 ms, 在所有 C++ 提交中击败了17.30%的用户
内存消耗 :15 MB, 在所有 C++ 提交中击败了100.00%的用户