力扣155题,最小栈
题目描述
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int 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.
解法一:不考虑时间复杂度,使用vector
class MinStack{
public:
MinStack()
{
nums={};
}
void push(int val)
{
nums.push_back(val);
}
void pop()
{
nums.pop_back();
}
int top()
{
// cout<<*(nums.end()-1)<<endl;
return *(nums.end()-1);
}
int getMin()
{
int length=nums.size();
int minValue=nums[0];
for(int i=0;i<length;i++)
{
minValue=min(minValue,nums[i]);
}
// cout<<minValue<<endl;
return minValue;
}
private:
vector<int>nums;
};
解法二:使用辅助栈
//使用辅助栈,一个作为数据栈,一个作为最小栈
class MinStack2{
private:
stack<int>dataStk;
stack<int>minStk;
public:
MinStack2()
{
//最小栈先初始化入栈一个最大值
minStk.push(INT_MAX);
}
void push(int val)
{
dataStk.push(val);
minStk.push(min(minStk.top(),val));
}
void pop()
{
dataStk.pop();
minStk.pop();
}
int top()
{
// cout<<dataStk.top()<<endl;
return dataStk.top();
}
int getMin()
{
// cout<<minStk.top()<<endl;
return minStk.top();
}
};
解法三,不使用辅助栈,并不使用额外空间,堆栈保存差值
//不适用额外空间
class MinStack3
{
private:
int minValue=NULL;
stack<long>dataStk;
public:
MinStack3()
{
}
void push(int val)
{
if(dataStk.empty())
{
dataStk.push(0L);
minValue=val;
}
else
{
//数据栈中保存的是数字和最小值的差
dataStk.push(long(val)-minValue);
minValue=min(val,minValue);
}
}
//如果插值diff大于等于0,说明要出栈的值大于等于当前的min,则要出栈的值在入栈的时候没有更新min,返回min+diff
// 如果插值diff小于0,说明当前要出栈的值就是min(因为入栈的时候我们选择的就是min和入栈元素的最小值),同时,通过min-diff计算出之前min
//要注意的是diff可能会超出int范围,类似于 Integer.MAX_VALUE - 1 这种,所以diff要用Long存
void pop()
{
long diff=dataStk.top();
dataStk.pop();
if(diff>=0)
{
}
else
{
int res=minValue;
minValue=minValue-diff;
}
}
int top()
{
long diff=dataStk.top();
if(diff>=0)
{
// cout<<minValue+diff<<endl;
return minValue+diff;
}
else{
// cout<<minValue<<endl;
return minValue;
}
}
int getMin()
{
// cout<<minValue<<endl;
return minValue;
}
};