最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的最小元素。
示例:
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
思路
解法一:
使用辅助栈一一对应储存元素的栈,来保证 pop
和 push
的时候每次都是最小的元素。
class MinStack {
stack<int> valStack;
stack<int> minStack;
public:
MinStack() {
minStack.push(INT_MAX); // 初始化的时候填入最大值,便于后续比较
}
void push(int val) {
valStack.push(val);
minStack.push(min(minStack.top(), val)); // 每次 push 最小的元素
}
void pop() {
valStack.pop();
minStack.pop();
}
int top() {
return valStack.top();
}
int getMin() {
return minStack.top();
}
};
解法二:
使用辅助栈一一对应储存元素的栈,来保证 pop
和 push
的时候每次都是最小的元素。
class MinStack
{
vector<int> vec;
vector<int> minVec;
public:
MinStack()
{
}
void push(int val)
{
vec.push_back(val);
if (minVec.size() == 0)
{
minVec.push_back(val);
}
else if (val <= minVec[minVec.size() - 1])
{ // // 小于等于,防止多个最小值的情况
minVec.push_back(val);
}
}
void pop()
{
if (vec.size() == 0)
{ // 防止越界
return;
}
if (vec[vec.size() - 1] == minVec[minVec.size() - 1]) //
{
minVec.pop_back();
}
vec.pop_back();
}
int top()
{
return vec[vec.size() - 1];
}
int getMin()
{
return minVec[minVec.size() - 1];
}
};