题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
- 看到题目第一反应是添加一个变量,随着push保存其最小值,min()则返回这个变量的值,而没有考虑到pop操作
- 考虑到pop操作,则min不能只是一个变量值,而应该是一个容器,随着push的操作动态的保存栈底到当前栈顶的最小值,这样pop元素时还能找到剩下的元素的最小值
- 栈的特点是先进后出,执行pop操作时,前面的元素是不变的,最方便的便是设置一个栈,可以保持同步push和pop操作
- 题目要求时间复杂度为O(1),那么该容器取最小值时应是可以立即取出,令栈顶保存当前栈的最小值,push时令新元素与其进行对比,若小于栈顶,push新元素使其成为新的栈顶,若大于栈顶,仍让栈顶元素成为最小值,并push,和另一个非保存最小值的栈保持大小一致
class Solution {
public:
stack<int> stack1,stack2;
void push(int value) {
stack1.push(value);
if(stack2.empty())
{
stack2.push(value);
}
else if( stack2.top() < value)
{
stack2.push(stack2.top());
}
else{
stack2.push(value);
}
}
void pop() {
{
if(!stack1.empty())
{
stack1.pop();
stack2.pop();
}
}
}
int top() {
return stack1.top();
}
int min() {
return stack2.top();
}
};