设计一个有getMin功能的栈
要求:pop、push、getMin操作的时间复杂度都是O(1),设计时可以使用现成的栈结构
思路:使用两个栈,一个栈stackData用来保存当前栈中的元素,和普通栈没区别,另一个栈stackMin用于保存每一步的最小值。
(1)压入数据规则
如果当前数据为newNum,先将其压入stackData。然后判断stackMin是否为空:
- 如果为空,则newNum也压入stackMin
- 否则,比较nuwNum和stackMin栈顶元素哪一个更小
- 如果newNum更小或者两者相等,则newNum也压入stackMin
- 否则stackMin不压入任何内容
(2)弹出数据规则
先在stackData中弹出栈顶元素,记为value。value等于stackMin的栈顶元素时,弹出该栈顶元素,否则不弹出栈顶元素,返回value。
class MinStack(object):
def __init__(self):
self.stackData = []
self.stackMin = []
def push(self, x):
self.stackData.append(x)
if len(self.stackMin) == 0 or x<=self.getMin():
self.stackMin.append(x)
def pop(self):
if len(self.stackData) == 0:
return
value = self.stackData.pop()
if value == self.stackMin[-1]:
self.stackMin.pop()
return value
def top(self):
if len(self.stackData) == 0:
return
return self.stackData[-1]
def getMin(self):
if len(self.stackMin) == 0:
return
return self.stackMin[-1]