剑指offer20_包含min函数的栈_题解
包含min函数的栈
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数 时间复杂度应为\(O(1)\)
分析
方案一:辅助栈
数据栈 A : 栈 A 用于存储所有元素,保证入栈 push() 函数、出栈 pop() 函数、获取栈顶 top() 函数的正常逻辑。
辅助栈 B : 栈 B 中存储栈 A 中所有 非严格降序 的元素,则栈 A 中的最小元素始终对应栈 B 的栈顶元素,即 min() 函数只需返回栈 B 的栈顶元素即可。
/**
时间复杂度:O(1)
push(), pop(), top(), min() 四个函数的时间复杂度均为常数级别。
空间复杂度:O(N)
当共有 N 个待入栈元素时,辅助栈 B 最差情况下存储 N 个元素,使用 O(N) 额外空间。
**/
//辅助栈
class Solution
{
public:
stack<int> A, B;
void push(int value)
{
A.push(value);
// 若栈B为空或value<=栈B的栈顶元素,则将value压入栈B
if (B.empty() || value <= B.top())
B.push(value);
}
void pop()
{
// 栈A出栈,将出栈元素保存到A_top中
int A_top = A.top();
A.pop();
// 若出栈元素的值等于栈B的栈顶元素,则执行栈B出栈
if (A_top == B.top())
B.pop();
}
// 直接返回栈A的栈顶元素
int top()
{
return A.top();
}
// 直接返回栈B的栈顶元素
int min()
{
return B.top();
}
};
方法二:单个栈
在push入栈时,判断当前元素是否小于最小值m,如果小于则将原最小值和最新的最小值相继入栈
在pop出栈时判断出栈元素是否等于最小值m,如果等于最小值m则将当前最小值指向栈顶元素并将栈顶元素出栈,这样就得到了下一个新的最小值了。
/**
时间复杂度:O(1)
push(), pop(), top(), min() 四个函数的时间复杂度均为常数级别。
空间复杂度:O(1)
当共有 N 个待入栈元素时,辅助栈 B 最差情况下存储 N 个元素,使用 O(N) 额外空间。
**/
// 单个栈
class Solution
{
public:
stack<int> A;
int m;
void push(int value)
{
// 如果当前元素小于最小值,将原来最小值和最新的最小值相继入栈
if (A.empty() || value <= m)
{
A.push(m);
m = value;//更新最小值
}
A.push(value);
}
void pop()
{
// 如果出栈元素和当前最小值相等,则将栈顶元素出栈,更新当前最小值,然后再次出栈
if (A.top() == m)
{
A.pop();
m = A.top();
}
A.pop();
}
int top()
{
return A.top();
}
int min()
{
return m;
}
};