最小栈
用Python实现最小栈。题目描述如下:
举个栗子:

要在常数时间内返回栈的最小值,所以不能在getMin方法里再去找最小值了。只能在入栈和出栈的时候,就要记录当前栈最小值。
考虑到如果执行了出栈操作,此时栈的最小值也要记录。这意味着,对于每次入栈的操作,操作前和操作后的栈的最小值都要记录。
1. 第一个的思路:
采用两个栈。第一个栈(stack1)用来记录当前栈;第二个栈(stack2)用来记录各个操作后的栈的最小值。
stack2的栈顶一定要小于栈底。
每次入栈操作时,如果新入栈的数大于stack2的栈顶,那么意味着操作后的栈的最小值仍然等于stack2的栈顶,因此stack2不操作;而当新入栈的数小于等于stack2的栈顶时,此时操作后的栈的最小值已经更新,因此需要将stack2的栈顶更新为新入栈的数。
每次出栈操作时,如果stack1栈顶的数刚好等于stack2栈顶的数,此时将stack2的栈顶的元素弹出;否则,stack2栈顶的元素仍然是出栈后的栈的最小值。
这里,由于stack2最先进去的元素,可能最后才弹出来,有了这种反转的性质,必然会想到要用到栈的数据结构。
1 class MinStack(object): 2 3 def __init__(self): 4 """ 5 initialize your data structure here. 6 """ 7 self.stack1 = [] #all 8 self.stack2 = [] #min 9 10 def push(self, x): 11 """ 12 :type x: int 13 :rtype: None 14 """ 15 self.stack1.append(x) 16 if not self.stack2: 17 self.stack2.append(x) 18 elif self.stack2[-1] >= x: 19 self.stack2.append(x) 20 21 def pop(self): 22 """ 23 :rtype: None 24 """ 25 temp = self.stack1[-1] 26 if self.stack2 and self.stack2[-1] == temp: 27 self.stack2.pop() 28 self.stack1.pop() 29 30 def top(self): 31 """ 32 :rtype: int 33 """ 34 return self.stack1[-1] 35 36 37 def getMin(self): 38 """ 39 :rtype: int 40 """ 41 return self.stack2[-1]
1. 第二个的思路:
能否只用一个栈来实现呢?
如果用一个栈来实现,我们需要记录每次入栈后的栈的最小值。当遇到这种要同时记录两个变量的情况时,我们可以考虑令栈内的元素类型为元组。对于栈内的每一个元素(x,y),x记录新入栈的值,y记录当前栈最小值。
因此,事情就变得很简单。只要每次执行入栈操作前,比较新入栈的数和栈顶元素的y即可。
1 class MinStack(object): 2 3 def __init__(self): 4 """ 5 initialize your data structure here. 6 """ 7 self.stack1 = [] 8 def push(self, x): 9 """ 10 :type x: int 11 :rtype: None 12 """ 13 if not self.stack1: 14 self.stack1.append((x,x)) 15 else: 16 self.stack1.append((x,min(x,self.stack1[-1][1]))) 17 18 def pop(self): 19 """ 20 :rtype: None 21 """ 22 temp = self.stack1.pop() 23 24 def top(self): 25 """ 26 :rtype: int 27 """ 28 return self.stack1[-1][0] 29 30 31 def getMin(self): 32 """ 33 :rtype: int 34 """ 35 return self.stack1[-1][1]
两种思路的执行效率如下:


浙公网安备 33010602011771号