# 例子: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3 minStack.pop(); minStack.top(); --> 返回 0 minStack.min(); --> 返回 -2题解:
首先拿到这道题,可以看到,实现一个栈,并且栈包含入栈、出栈、得到栈顶元素和栈最小值的一些 *** 作,实现这些 *** 作,其实很简单,但是题目要求时间复杂度为O(1),这样的话,我们平常的一些方法。就不太好做了。
这里我们可以使用两个栈来完成这个功能
栈A:为主要的栈,像push、pop、top都有它来完成,并且时间复杂度为O(1)
栈B:为辅助栈,主要帮助栈A完成min *** 作,我们让栈B的栈顶元素一直保持是栈A的最小值,这样执行min *** 作时,只需要将栈B的栈顶元素d出就可以了
这种怎么样来实现呢?
- 在给栈A添加元素的时候,判断:栈B 是否为空,如果为空,则同时将元素添加至栈B;如果栈B不为空,那么判断栈B顶的元素是都大于等于要添加的元素,则同样执行将元素添加至栈B
- 在给栈A删除元素的时候,判断:如果栈A删除的元素和栈B的栈顶元素相等,则同样删除栈B的栈顶元素
看代码:
class MinStack(): def __init__(self): self.stack_A = [] self.stack_B = [] def push(self,x): self.stack_A.append(x) if not self.stack_B or self.stack_B[-1] >= x: self.stack_B.append(x) def pop(self): vertex = self.stack_A.pop() if vertex == self.stack_B[-1]: self.stack_B.pop() def top(self): return self.stack_A[-1] def min(self): return self.stack_B[-1] a = MinStack() a.push(-2) a.push(0) a.push(-3) a1 = a.min() print(f"a1 = {a1}") a.pop() a2 = a.top() print(f"a2 = {a2}") a3 = a.min() print(f"a3 = {a3}")
""" results: a1 = -3 a2 = 0 a3 = -2 """
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)