最近刷題的時候遇到了優先佇列。與一般的佇列(先進先出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 ...