面试题30. 包含min函数的栈
解题思路:
本题难点在于调用 min、push 及 pop 的时间复杂度都是 O(1)。栈调用push和pop复杂度就是O(1),但是要实现min()函数需要遍历栈对比,时间复杂度是Q(N),则要实现O(1)可以定义两个栈,一个数据栈A和一个辅助栈B。
- 数据栈 AA : 栈 AA 用于存储所有元素,保证入栈 push() 函数、出栈 pop() 函数、获取栈顶 top() 函数的正常逻辑。
- 辅助栈 BB : 栈 BB 中存储栈 AA 中所有 非严格降序 的元素,则栈 AA 中的最小元素始终对应栈 BB 的栈顶元素,即 min() 函数只需返回栈 BB 的栈顶元素即可。
- 辅助栈BB的push()函数实现:判断BB是否为空,空则直接将元素入栈,非空拿当前元素和BB的栈顶元素比较小于等于入栈。
- 辅助栈BB的pop()函数实现:判断当前AA的即将出战的元素(栈顶元素)是否和BB的栈顶元素相同,相同则一起出栈,不同则BB元素不出栈。
class MinStack {
stack<int> stack1;
stack<int> stack2;
public:
/** initialize your data structure here. */
MinStack() {
while(!stack1.empty())
{
stack1.pop();
}
while(!stack2.empty())
{
stack2.pop();
}
}
void push(int x) {
stack1.push(x);
if(stack2.empty())
stack2.push(x);
else if(x <= stack2.top())
stack2.push(x);
}
void pop() {
if(stack1.top() == stack2.top())
stack2.pop();
stack1.pop();
}
int top() {
int num = stack1.top();
return num;
}
int min() {
if(stack2.empty())
{
return NULL;
}
int num = stack2.top();
return num;
}
};