问题描述
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) – 将元素 x 推入栈中。
- pop() – 删除栈顶的元素。
- top() – 获取栈顶元素。
- getMin() – 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
问题分析
比正常的栈多出一个取最小值的方法,这里给出一种解法,在类中定义两个初始栈,一个用于正常元素,一个用于记录当前最小元素。两者数量保持一致,在正常元素栈变动同时相对变动,动态更新最小栈值
代码
class MinStack(object):
def __init__(self):
self.stack = [] # 第一个栈,用于存储所有元素(元素栈)
self.min = [] # 第二个栈,用于存储最小元素(最小栈)
def push(self, x):
self.stack.append(x) # 把新元素压入元素栈
if not self.min or x < self.min[-1]: # 如果最小栈为空或新元素比
元素栈的最小值还要小就将其压入最小栈
self.min.append(x)
else:
self.min.append(self.min[-1]) # 将最小栈中的栈顶元素复制一遍压入最小栈,
这里的目的是保留两栈数目相等
def pop(self):
self.min.pop() # 弹出最小栈中的元素,保证两个栈元素个数相同
return self.stack.pop() # 弹出元素栈中的元素
def top(self):
return self.stack[-1] # 返回元素栈的栈顶元素
def getMin(self):
return self.min[-1] # 返回最小栈的栈顶元素