题解 | 包含min函数的栈
包含min函数的栈
https://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49
class Solution { public: void push(int value) { s1.push(value); if (s2.empty() || value < s2.top()) s2.push(value); else s2.push(s2.top()); } void pop() { s1.pop(); s2.pop(); } int top() { return s1.top(); } int min() { return s2.top(); } private: stack<int> s1, s2; };
和栈内最小的比较,比它小就入栈,否则在此刻最小的还是原来那个,记录每一个时刻的最小值(按顺序压入,也会按顺序弹出)
所以我们需要一个当前时刻最小值栈和储存所有元素的基础栈。每次基础栈入栈时,时刻最小栈比较上一个时刻的最小值和基础栈入栈值,如果更小就说明这一个时刻产生了更小的,把它压入,否则依然压入原来的,表示这个时刻最小的还是它。
这样在弹出时也不影响,因为保存的时刻是基础栈内的压入顺序,已经出去的元素不会影响在它之前进入的时刻的最小值。