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; } };