参考视频:程序员面试必会算法题,包含min函数的栈
分析:关于栈的push pop top 方法都是和普通栈一样,就是得到栈中最小元素min()方法不一样。
假如我们对每次push进栈的元素进行排序,使得最小的元素位于栈顶,那么就可以在o(1)时间复杂度内实现min()方法。但单纯这样子不能保证pop,top等方法是按照栈的先入后出的规定。换言之,此时则不是一个栈了。所以需要借助一个辅助栈来实现。
如下图:
进行上述操作后,可以看到,辅助栈的栈顶一定是对应每次操作后数据栈的最小值。
代码如下:
class Solution {
public:
stack<int> s;
stack<int> min_data;
void push(int value) {
s.push(value);
if(min_data.empty())
min_data.push(value);
if(value > min_data.top())
value = min_data.top();
min_data.push(value);
}
void pop() {
min_data.pop();
s.pop();
}
int top() {
return s.top();
}
int min() {
return min_data.top();
}
};