leetcode 最小栈 简单 (空间复杂度可优化至 o1)

 

 常数时间维护最小值:就相当于维护一个前缀最小值数组,即 minn[i] 表示 数组 [0, i] 的最小值

class MinStack {
public:
    /** initialize your data structure here. */
    MinStack() {

    }

    void push(int val) {
        st.push_back(val);
        if(minn.empty()) {
            minn.push_back(st.back());
        } else {
            minn.push_back(minn.back() > val ? st.back(): minn.back());
        }
    }

    void pop() {
        st.pop_back();
        minn.pop_back();
    }

    int top() {
        return st.back();
    }

    int getMin() {
        return minn.back();
    }

private:
    vector<int> st;
    vector<int> minn;
};

 

还有一种空间复杂度 O(1) 的做法:假设整个输入的数组叫 arr

vector<int> st,st[i] = arr[i] - min(arr[0], ..., arr[i - 1])

还有一个变量 minn = min(arr[0], ..., arr[i])

假设当前要执行 pop() 时,如果 st[st.size() - 1] < 0,即 arr[st.size() - 1] -  min(arr[0], ..., arr[st.size() - 1 - 1]) < 0,即 arr[st.size() - 1] < min(arr[0], ..., arr[st.size() - 1 - 1])

所以可知道 minn = arr[st.size() - 1],那么在 pop 执行之前可算出 min(arr[0], ..., arr[st.size() - 1 - 1]) = arr[st.size() - 1] - st[st.size() - 1] = minn - st[st.size() - 1]

如果 st[st.size() - 1] >= 0,那就说明最小值没有变化

同样的,top() 返回的值应该是 st[st.size() - 1] + min(arr[0], ..., arr[st.size() - 1 - 1])

(!! 唯一一点需要注意的地方就是,用 long long 类型,因为题目数据存在 INT_MAX 的情况)

class MinStack {
public:
    /** initialize your data structure here. */
    MinStack() {

    }

    void push(long long val) {
        st.push_back(val - minn);
        minn = min(minn, val);
    }

    void pop() {
        minn = last_min();
        st.pop_back();
    }

    int top() {
        return st.back() + last_min();
    }

    int getMin() {
        return minn;
    }

private:
    vector<long long> st;
    long long minn = INT_MAX;

    int last_min() {
        if(st.back() < 0) {
            return minn - st.back();
        }
        return minn;
    }
};

 

posted @ 2021-07-24 10:25  rookie_Acmer  阅读(128)  评论(0)    收藏  举报