【题目】
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
【要求】
1、 pop、push、getMin操作的时间复杂度都是O(1)。
2.、设计的栈类型可以使用现成的栈结构
【解题思路】
方法一:首先想到的是,获取栈中的元素时肯定需要遍历栈中的元素,那时间复杂度就是O(N),不符合题目要求的O(1)。此时考虑用两个栈保持O(1)的复杂度,栈stackMin用来专门存储最小值元素。例如,刚开始时,两栈均为空,如果来一个数num1,stackData与stackMin均进栈,之后再来一个数num2进栈的话,stackData直接进栈,对于stackMin来说,如果num2num1,则让stackMin的栈顶元素再一次进栈。对于pop,每次两个栈均弹出栈顶元素即可。很明显,每次stackMin均弹出的是栈stackData内的最小值。
方法二与方法一类似。
题目要求设计的栈类型可以使用现成的栈结构,在python中我们使用列表实现。
代码:(python3)
class Stack1(object):
def __init__(self):
self.stackData=[]
self.stackMin=[]
def push(self,num):
self.stackData.append(num)
if len(self.stackMin)==0 or num<=self.getMin():
self.stackMin.append(num)
else:
self.stackMin.append(self.getMin())
def pop(self):
if len(self.stackData)==0:
raise Exception("stack is empty")
self.stackMin.pop()
return self.stackData.pop()
def getMin(self):
if len(self.stackMin)==0:
raise Exception("stack is empty")
return self.stackMin[-1]
class Stack2(object):
def __init__(self):
self.stackData=[]
self.stackMin=[]
def push(self,num):
self.stackData.append(num)
if len(self.stackMin)==0 or num<=self.getMin():
self.stackMin.append(num)
def pop(self):
if len(self.stackData)==0:
raise Exception("stack is empty")
value=self.stackData.pop()
if self.getMin()==value:
self.stackMin.pop()
return value
def getMin(self):
if len(self.stackMin)==0:
raise Exception("stack is empty")
return self.stackMin[-1]