算法竞赛进阶指南-41.包含min函数的栈
题目链接
设计一个支持push,pop,top等操作并且可以在时间内检索出最小元素的堆栈。
- push(x)–将元素x插入栈中
- pop()–移除栈顶元素
- top()–得到栈顶元素
- getMin()–得到栈中最小元素
数据范围
操作命令总数 。
样例
MinStack minStack = new MinStack();
minStack.push(-1);
minStack.push(3);
minStack.push(-4);
minStack.getMin(); --> Returns -4.
minStack.pop();
minStack.top(); --> Returns 3.
minStack.getMin(); --> Returns -1.
Method : 单调栈
维护一个非严格单调递减栈作为辅助栈,该栈顶为当前栈中的最小值。
class MinStack {
public:
stack<int> s_val;
stack<int> s_min;
MinStack() {}
void push(int val) {
s_val.push(val);
if (s_min.empty() || s_min.top() >= val) {
s_min.push(val);
}
}
void pop() {
int val = s_val.top(); s_val.pop();
if (!s_min.empty() && s_min.top() == val) {
s_min.pop();
}
}
int top() {
return s_val.top();
}
int getMin() {
return s_min.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/
复杂度分析
时间复杂度:, 四种操作都只有常数次入栈出栈操作,所以时间复杂度都是 。
空间复杂度:,新开了一个单调栈作为辅助,空间开销。
本博客所有文章均采用 CC BY-NC-SA 4.0 协议 ,禁止商用,转载请注明出处!