【題目】
實現一個特殊的棧,在實現棧的基本功能的基礎上,再實現返回棧中最小元素的操作。
【要求】
1、 pop、push、getMin操作的時間複雜度都是O(1)。
2.、設計的棧類型可以使用現成的棧結構
【解題思路】
方法一:首先想到的是,獲取棧中的元素時肯定需要遍歷棧中的元素,那時間複雜度就是O(N),不符合題目要求的O(1)。此時考慮用兩個棧保持O(1)的複雜度,棧stackMin用來專門存儲最小值元素。例如,剛開始時,兩棧均爲空,如果來一個數num1,stackData與stackMin均進棧,之後再來一個數num2進棧的話,stackData直接進棧,對於stackMin來說,如果num2<num1,則stackMin進棧;如果num2>num1,則讓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]