python優先佇列

2021-10-19 22:56:25 字數 1118 閱讀 8370

最近刷題的時候遇到了優先佇列。與一般的佇列(先進先出fifo)不同的是,優先佇列一般是最高端的優先出(即最大的先出)。

一開始想到的,可以用堆來維護乙個優先佇列。不過,python中的堆是乙個小根堆,即每次頂部pop出的都是最小值。

這樣一來,我想到了41. 資料流中的中位數,能不能把數字變負,寫入小根堆。

優先佇列插入資料的方式和list略有不同,採用的是add方法。

舉個例子,一目了然

sl = sortedlist([2

,3,4

,5])

sl.add(6)

print

(sl)

#sortedlist([2, 3, 4, 5, 6])

sl.pop(

)print

(sl)

#sortedlist([2, 3, 4, 5])

優先佇列在leetcode中的應用

1675. 陣列的最小偏移量

思路:1.將奇數值*2之後與偶數值一起存入優先佇列;

2.由於偶數值不能變大,而奇數不可能進一步變小,因此只需要找到最大奇數值與最小偶數值的差即為結果

from sortedcontainers import sortedlist

class

solution

(object):

defminimumdeviation

(self, nums)

:"""

:type nums: list[int]

:rtype: int

"""#如果是奇數就翻倍

sl = sortedlist(

[num*

2if num&

1else num for num in nums]

) res = sl[-1

]- sl[0]

#計算差值,只到最大的乙個數字是奇數為止

while sl[-1

]%2==

0:sl.add(sl.pop()//

2)res =

min(res,sl[-1

]-sl[0]

)return res

python優先佇列

q queue.priorityqueue q.put 呼叫的是heapq.heap item 而headpush 方法則是呼叫每個item的比較大小方法,預設是小的在頂端,所以是小頂堆。所以能用元組自定義插入順序,比如 2,item1 3,item2 所以q.put 2.item1 q.put 3...

python優先順序佇列 python 優先順序佇列

簡介 優先順序佇列是基於堆的,關於堆的時候可以參考文章堆,優先順序佇列就是入隊時,會分配乙個優先順序,之後出隊時,根據優先順序出列。如,入隊時 4,a 6,r 3 d 則出隊順序 6,r 4,a 3 d 優先順序佇列的python實現 class priorityqueue object def i...

python優先順序佇列

class priorityqueue data dict def init self pass 入隊 如果物件沒有優先等級,則新增到隊尾,如果對空,則預設等級為1 如果物件有優先等級,如果有同等級的則新增到對應等級末尾 def push self,obj,key none if key none ...