LintCode刷题 12. 带最小值操作的栈

原题链接:

http://www.lintcode.com/zh-cn/problem/min-stack/

题目描述

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

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

注意事项

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

样例

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

题目解析:

题目的要求就是在O(1)的时间内完成min操作。可以考虑以空间换时间。

思路

添加一个minStack栈,用来存储最小值。

当往stack中添加一个元素时,判断当前元素是不是比minStack栈顶的元素大,大就不操作,否则就将该元素也压入minStack中。这样,minStack中就存储了一系列最小值,栈顶元素就是最小值。

当弹出stack中的元素时,判断下当前弹出的元素是不是跟minStack元素相等,相等就弹出minStack栈顶元素。

注:在python中,list[-1]代表取数组的最后一个元素,也就是栈顶元素。

代码(Python)

class MinStack:
    
    def __init__(self):
        # do intialization if necessary
        #主栈
        self.stack = []
        #最小值栈
        self.minStack = []

    """
    @param: number: An integer
    @return: nothing
    """
    def push(self, number):
        # write your code here
        self.stack.append(number)
        
        #符合条件就将值压入最小值栈
        if not self.minStack:
            self.minStack.append(number)
        else:
            if number <= self.minStack[-1]:
                self.minStack.append(number)

    """
    @return: An integer
    """
    def pop(self):
        # write your code here
        if not self.stack:
            return None
        #如果最小值栈的栈顶元素与当前要弹出的元素相等,那该栈顶元素和要弹出
        if self.stack[-1] == self.minStack[-1]:
            self.minStack.pop()
        return self.stack.pop()

    """
    @return: An integer
    """
    def min(self):
        # write your code here
        if not self.minStack:
            return None
        return self.minStack[-1]
复制代码

谦言忘语

个人目前只懂一丁点python语法,所以不做语法上的优化,而且整体代码风格效果会尽量跟C语言趋于一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值