本人感觉牛客官方题解的代码和细节处理的思路略显冗余(个人观点,如有错误,请指正)
方法依旧是辅助栈。
sta_1存放的是正常存取的一个栈,可以返会正确的top的值
sta_2 维护的是一个目前最小值的栈。
细节处理思路:
当调用 push、pop、top 时 毫无疑问,sta_1执行对应的操作,所以后面的详细说明都是关于sta_2的
当调用 push、pop、top 时 sta_2执行的操作和逻辑
push(int value):
1.sta_2为空时,这个时候只需要将这个值压入sta_2就行(因为此时sta_1也是压入第一个值,这个值自然就是最小值)
2.当 value <= sta_2.top()时自然也是需要压入这个值的 为什么是小于等于呢 你想想等于的情况(这里建议自己仔细想一下,是一个细节)

所有综上 if(sta_2.empty() || value <= sta_2.top())
            sta_2.push(value);

pop()时
只要知道此时sta_1的栈顶的值是不是对应sta_2的值,如果是,就把sta_2的值也弹出去。这样就是弹出的时候也维护了最小值(下面迷之例子)
sta_1 <--------> sta_2
1------------------1
2------------------2
4------------------ //(4比3大不入sta_2)
3------------------3

class Solution {
public:
    stack<int> sta_1,sta_2;  //
    void push(int value) {
        sta_1.push(value);
        if(sta_2.empty() || value <= sta_2.top())
            sta_2.push(value);
    }
    void pop() {
        if(sta_1.top() == sta_2.top() )
            sta_2.pop();
        sta_1.pop();
    }
    int top() {
        return sta_1.top();
    }
    int min() {
        return sta_2.top();
    }
};