包含min函数的栈
第二天打卡,废话不多说,我们开始吧。
题目
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
提示:
各函数的调用总次数不超过 20000 次
思路:
我们通过读题,可以发现需要在常量级的时间内找到最小值!
那自然就可以想到,我们绝不能在需要最小值的时候,再做排序,查找等操作来获取!所以,我们可以创建两个栈,一个栈是原栈 min,正常进行操作,而辅助栈assi则存放应主栈不同时期的最小值。
代码实现
class MinStack {
stack<int> mi,ass;
public:
/** initialize your data structure here. */
MinStack() {
ass.push(INT_MAX); //初始化辅助栈,使top函数能正常操作
}
void push(int x) { //压栈的时候我们对原栈和辅助栈都要进行操作,
//原栈就正常压,辅助栈在压的时候进行判断,压当前栈和输入中的最小的
mi.push(x);
if(x<ass.top()){
ass.push(x);
}
else ass.push(ass.top());
}
void pop() { //弹出的时候两者一致,直接弹,这是因为我们前面在压的时候保持两个栈都压了。
mi.pop();
ass.pop();
}
int top() {
return mi.top();
} //返回原栈的当前栈顶元素
int min() {
int res = ass.top();
return res;
} //返回辅助栈当前栈顶元素
};
运行结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/1c38e8a9b4844bee9a35d1b767fa67e0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57u057qz5pav6auY5aSa5bCR,size_18,color_FFFFFF,t_70,g_se,x_16
时间复杂度:其实题目中就已经给出要求,这些操作都在常数级时间复杂度。
空间复杂度:在这里我们用了两个栈来储存数据,所以空间复杂度是O(n)。