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

560 阅读2分钟

原题链接:

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语言趋于一致。