LintCode 12 带最小值操作的栈

题目:MinStack


要求:

实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。

你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成。

 注意事项

如果堆栈中没有数字则不能进行min方法的调用

样例:

如下操作:push(1)pop()push(2)push(3)min()push(1)min() 返回 1,2,1

算法要求:

解题思路:

这道题有二种常规的算法,一种是额外用一个辅助栈存最小值;另一种就是将栈值都存为与最小值的差,因为一次只能出栈一个数,所以我们只需要适时的改变minNumber的值就可以了(第二种方法目前适用于数字),在push的时候,我们将小于当前最小值的数,存为负数,值为二数之差,这样在pop的时候就可以根据是否为负数来判断是否需要变为上一个最小值,即栈值为负数时,当前最小值为实际的栈值,负数的值为为比上一个最小值小多少。相当于,每个数都记录了上一个push前的最小值。
下面给出第二种方法,第一种方法实现非常简单,请读者自行实现。

算法如下:

class MinStack {
public:
    MinStack() {
        top = -1;
        numStack = new int[100];
    }

    void push(int number) {
        if (top == 99) {
            throw top;
        }
        if (top == -1) {//第一次push的时候需要将第一个数设为最小值
            minNumber = number;
            numStack[++top] = 0;
        } else if (number < minNumber) {//遇到了比当前最小值更小的数
            numStack[++top] = number - minNumber;
            minNumber = number;
        } else {//储存与当前最小值的差值即可
            numStack[++top] = number - minNumber;
        }
    }

    int pop() {
        if (top == -1) {
            throw top;
        }
        if (numStack[top] >= 0) {//这里为当值为正数时,其实际的值为最小值+差值
            return numStack[top--] + minNumber;
        } else {//这是为负数时,其实际的值为最小值,再将最小值还原为上一次的最小值
            minNumber = minNumber - numStack[top];
            return minNumber + numStack[top--];
        }
    }

    int min() {
        if (top == -1) {
            throw top;
        }
        return minNumber;
    }
    ~MinStack() {
        delete numStack;
    }

private:
    int *numStack;
    int top;
    int minNumber;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值