算法竞赛进阶指南-41.包含min函数的栈

题目链接

算法竞赛进阶指南-41.包含min函数的栈

设计一个支持push,pop,top等操作并且可以在O(1)O(1)时间内检索出最小元素的堆栈。

  • push(x)–将元素x插入栈中
  • pop()–移除栈顶元素
  • top()–得到栈顶元素
  • getMin()–得到栈中最小元素

数据范围

操作命令总数 [0,100][0,100]

样例

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

复杂度分析

  • 时间复杂度:O(1){O(1)}, 四种操作都只有常数次入栈出栈操作,所以时间复杂度都是 O(1)O(1)

  • 空间复杂度:O(n){O(n)},新开了一个单调栈作为辅助,空间开销O(n)O(n)