一、介绍
1.题目描述
题目链接:https://leetcode-cn.com/problems/min-stack/
设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
push(x)
—— 将元素 x 推入栈中。pop()
—— 删除栈顶的元素。top()
—— 获取栈顶元素。getMin()
—— 检索栈中的最小元素。
2.测试样例
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
# [null,null,null,null,-3,null,0,-2]
["MinStack","push","push","push","top","pop","getMin","pop","getMin","pop","push","top","getMin","push","top","getMin","pop","getMin"]
[[],[2147483646],[2147483646],[2147483647],[],[],[],[],[],[],[2147483647],[],[],[-2147483648],[],[],[],[]]
# [null,null,null,null,2147483647,null,2147483646,null,2147483646,null,null,2147483647,2147483647,null,-2147483648,-2147483648,null,2147483647]
["MinStack","push","push","getMin","getMin","push","getMin","getMin","top","getMin","pop","push","push","getMin","push","pop","top","getMin","pop"]
[[],[-10],[14],[],[],[-20],[],[],[],[],[],[10],[-7],[],[-7],[],[],[],[]]
# [null,null,null,-10,-10,null,-20,-20,-20,-20,null,null,null,-10,null,null,-7,-10,null]
二、题解(辅助栈)
我们定义一个栈 stk 用于正常的入栈出栈,再定义一个辅助栈 stk_min 存储当前已入栈元素中的最小值。
参考链接:https://leetcode-cn.com/problems/min-stack/solution/zui-xiao-zhan-by-leetcode-solution/
1、记录最小值 t🟡
要实现这一功能,我们可以在让两个栈同时出入元素, stk 正常出入,而stk_min需要进行判断后入栈,判断当前最小的元素为多少。
先定义一个t,取int最大值,当新元素入栈,判断是否更小,更小则更新t。
对于插入:
- 当栈为空,t为下一个入栈的元素
- 当栈不为空,t为当前最小值
对于弹出:
- 若栈不为空,t更新为stk_min栈顶
class MinStack {
stack<int> stk,stk_min;
int t=INT_MAX;
public:
MinStack() {}
void push(int val) {
// 栈为空,t为下一个入栈元素
if(stk.empty()) t=val;
// 栈不为空,经判断后更新t
if(val<t)t=val;
stk.push(val);
stk_min.push(t);
}
void pop() {
// 同时弹出
stk.pop();
stk_min.pop();
// 弹出后若栈不为空,t更新为当前stk_min的栈顶,即当前最小值
if(!stk_min.empty()) t=stk_min.top();
}
int top() {
// stk栈顶
return stk.top();
}
int getMin() {
// 最小值为stk_min栈顶
return stk_min.top();
}
};
2、垫入最大值🔴
对第一种代码进行改进,先在stk_min中垫一个int最大值,保证stk_min不为空。
之后与第一种代码类似,同进同出,只是在插入时在stk_min中插入min(stk_min栈顶,val),这样弹出时也不用对最小值进行更新
class MinStack {
stack<int> stk,stk_min;
public:
MinStack() {
// 在 stk_min中垫最大值,防止stk_min为空
stk_min.push(INT_MAX);
}
void push(int val) {
stk.push(val);
// 插入min(stk_min栈顶,val)
stk_min.push(min(stk_min.top(),val));
}
void pop() {
stk.pop();
stk_min.pop();
}
int top() {
return stk.top();
}
int getMin() {
return stk_min.top();
}
};