无力吐槽,翻了前面这么多题解没一个是按照题目要求写O\!\left(1\right)算法的,居然运行时间能在 10ms 以内,真是奇迹。

维护两个栈,一个维护编号本身,以下称为栈;一个维护编号前缀最小值,以下称为最小栈。于是就可以常数时间实现所有操作了。

class Solution {
    vector<int> stk;
    vector<int> minStk;
  public:
    void push(int value) {
        stk.push_back(value);
        minStk.push_back(minStk.empty() ? value : ::min(minStk.back(), value));
    }
    void pop() {
        stk.pop_back();
        minStk.pop_back();
    }
    int top() {
        return stk.back();
    }
    int min() {
        return minStk.back();
    }
};