如何用O 1 的時間複雜度求棧中最小元素

2021-09-10 02:06:04 字數 1511 閱讀 4652

class stack:

def __init__(self):

self.items =

def empty(self):

return len(self.items) == 0

def size(self):

return len(self.items)

def peek(self):

if not self.empty():

return self.items[len(self.items) - 1]

else:

return none

def pop(self):

if not self.empty():

return self.items.pop()

else:

print('棧已經為空')

def push(self, x):

class mystack:

def __init__(self):

self.elemstack = stack() # 用來儲存棧中的元素

self.minstack = stack() # 棧頂永遠儲存當前elemstack中最小的值

def push(self, data):

self.elemstack.push(data)

if self.minstack.empty():

self.minstack.push(data)

elif data < self.minstack.peek():

self.minstack.push(data)

def pop(self):

topdata = self.elemstack.peek()

self.elemstack.pop()

if topdata == self.mins():

self.minstack.pop()

return topdata

def mins(self):

if self.minstack.empty():

return 2 ** 32

else:

return self.minstack.peek()

if __name__ == '__main__':

stack = mystack()

stack.push(5)

print('棧中最小值為:' + str(stack.mins()))

stack.push(6)

print('棧中最小值為:' + str(stack.mins()))

stack.push(2)

print('棧中最小值為:' + str(stack.mins()))

stack.pop()

print('棧中最小值為:' + str(stack.mins()))

執行結果如下:

棧中最小值為:5

棧中最小值為:5

棧中最小值為:2

棧中最小值為:5

最小棧O 1 空間複雜度實現

設計乙個支援 push,pop,top 操作,並能在常數時間內檢索到最小元素的棧。push x 將元素 x 推入棧中。pop 刪除棧頂的元素。top 獲取棧頂元素。getmin 檢索棧中的最小元素。常見的一道題目,很多解答都是兩個棧的做法,這裡提供一下o 1 空間複雜度的做法。使用兩個棧的原因是,我...

時間複雜度為O(1)的跳台階

分析 這是一道典型的動態規劃的題目,我們可以這樣想,我們最後一步可以跳1級,也可以跳2級,跳 跳n級,我們用最後一步跳一級來舉例子,假設最後一步跳1級,那還剩下n 1個台階,又可以分為最後一步跳1級,2級 直到n 1級。好啦,就分析到這裡,我們可以看到當我們最後一步跳一級的時候,剩下的n 1級台階又...

O 1 複雜度求乙個棧的最小值

要求乙個棧的最小值,第一反應肯定是乙個個出棧,那樣太蠢了,如何更優呢?第乙個思路就是自己定義乙個指標,始終指向儲存了最小值的那個節點不就行了。看似正確,但是當你最小值的那個節點出棧了,那麼如何找到下乙個最小值呢?因此,我們需要乙個資料結構來儲存每乙個狀態下的最小值。即我們應當知道每當棧中插入乙個新元...