要做到实时得到getMin(),不妨就对栈内的每一个元素都记录下对应的当前栈内元素最小值。于是我们可以构建另一个栈StackMin,跟随数据本身的Stack同步进退。
void push(int x)
{
Stack.push(x);
if (StackMin.empty())
StackMin.push(x);
else
StackMin.push(min(x,StackMin.top()));
}
有一种更省空间的解法。就是压入栈内的元素不直接是x,而是delta = x-Min_old
。
入栈的时候,如果delta为正数,那么说明Min变量需要更新为Min_new = Min_old
,否则就是Min_new = x
出栈的时候,我们看到的是栈顶元素delta,以及Min_new。我们需要复原的是x和Min_old:
- 如果delta是正号,说明
Min_old = Min_new
,然后推出x = delta+Min_old
. - 如果delta是负号,说明
x = Min_new
,然后推出Min_old = x-delta
.