https://ac.nowcoder.com/acm/problem/3707

题目描述

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

  • 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.

算法1

(双栈)

我们定义两个栈,一个是正常的栈stk1,另一个是stk2,stk2的栈顶表示当前stk1从栈顶到栈底元素中的最小值

正常的push pop get_top操作由stk1完成

get_min由stk2完成

如何维护stk2

每次进行push操作时,将新加入的元素x与stk2栈顶元素进行比较如果x更小则在stk2中push一个x,否则push一个stk2的栈顶元素

pop操作stk1和stk2同时进行

(实际操作的时候只需要将小于等于stk2.top()的元素push到stk2。如果当前pop的元素和stk2.top()元素相同则stk2.pop()

时间复杂度

C++ 代码

class Solution {
public:
    stack<int> stk1;
    stack<int> stk2;
    Solution() {

    }
    void push(int value) {
        stk1.push(value);
        if(stk2.empty() || stk2.top() >= value)
            stk2.push(value);
    }
    void pop() {
        if(stk2.top() == stk1.top()) stk2.pop();
        stk1.pop();
    }
    int top() {
        return stk1.top();
    }
    int min() {
        return stk2.top();
    }
};