原题链接:
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语言趋于一致。