最小栈

用Python实现最小栈。题目描述如下:
最小栈_第1张图片

 

举个栗子:

最小栈_第2张图片

 

要在常数时间内返回栈的最小值,所以不能在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]

两种思路的执行效率如下:

最小栈_第3张图片

 

 

 

 
 

你可能感兴趣的:(最小栈)