[劍指Offer] 30_包含min函式的棧
阿新 • • 發佈:2019-01-13
題目
定義棧的資料結構,請在該型別中實現一個能夠得到棧最小元素的min函式。
在該棧中,呼叫min、push及pop的時間複雜度都是O(1)。
思路
- 首先觀察到min的時間複雜度是O(1),所以不可能是在我們呼叫min的時候再去計算棧中元素的最小值,最小值一定是提前儲存好的。其次最小值必須隨著push和pop更新,也就是最小值不可能是個單值,必須有辦法回溯。因此,可以將最小值也做成一個棧,同步push和pop。如果push進的元素小於當前最小值,則push該元素值進min_stack,否則push當前最小值進min_stack。我採用的方法是直接將min與val繫結成一個tuple進棧,大同小異。
- 時間複雜度:O(1)
- 空間複雜度:O(n)
程式碼
思路1:時間複雜度:O(1),空間複雜度:O(n)
class MinStack(object):
def __init__(self):
"""
initialize your data structure here. """
self.data = []
def push(self, x):
"""
:type x: int
:rtype: void
"""
if self.data:
min = x if self.data[-1][1] >= x else self.data[-1][1]
else:
min = x
self.data.append((x, min))
return
def pop(self):
"""
:rtype: void
"""
self.data.pop()
return
def top(self):
"""
:rtype: int
"""
return self.data[-1][0]
def getMin(self):
"""
:rtype: int
"""
return self.data[-1][1]