最小栈——不借助辅助空间的实现
最小栈与普通栈的区别就是可以以 o ( 1 ) o(1) o(1)的时间复杂度返回栈中的最小值。
1.解决方法
一般的解决方法是建立一个辅助栈,随着元素的入栈,将当前栈中所有元素的最小值存入到辅助栈中,取出元素时,同时将辅助栈中的元素弹出即为当前栈中元素的最小值。
经过查阅不借助辅助栈的方法并成功实现,因此记录下来。
该方法在元素存入栈时存放的不是元素的原始值,而是该值与当前栈中所有元素最小值的差值。当返回栈顶元素时,根据栈顶元素的正负(元素实际值与最小值之间的差值)计算得到元素的实际值。
另外,栈中的元素类型采用long long类型,因为如果新入栈的元素为-2147483648,此时的最小值为2147483647,两个数值做差就会导致int类型的数据溢出。
#include <iostream>
#include <stack>
using namespace std;
class MinStack {
stack<long long>stack;//存放栈顶元素与当前最小值的差值
long long curMin;
public:
MinStack() {
curMin = INT64_MAX;
}
void push(int val) {
//一开始栈中没有元素,存入0,curMin为val
if (stack.empty())
{
stack.push(0);
curMin = val;
}
else//栈中已存在元素
{
long long sub = val - curMin;
stack.push(sub);
//如果差值小于0,则更新当前最小值,否则当前最小值不变
if (sub < 0)
curMin += sub;
}
}
void pop() {
long long top = stack.top();
stack.pop();
//更新最小值,如果栈顶元素小于0表明之前的最小值要大于现在的最小值,否则最小值不变
curMin = top < 0 ? (curMin - top) : curMin;
}
int top() {
//如果栈顶元素小于等于0,则表明当前的最小值就是实际值,因为当加入的元素小于最小值时才更新最小值
if (stack.top() <= 0)
return curMin;
else//栈顶元素大于0,说明实际值大于当前的最小值
return curMin + stack.top();
}
int getMin() {
return curMin;
}
};