02-13:leetcode重刷5之最大堆/最小堆

1、最大堆/最小堆結(jié)構(gòu)

(1)最大堆

堆頂元素最大,其他元素都小于等于:堆頂

(2)最小堆

堆頂元素最小,其他元素都大于等于:堆頂

常用函數(shù):

python自帶的建堆函數(shù)是最小堆

heap,heapify

經(jīng)典例題:

1、數(shù)據(jù)流的第K大個元素

703. 數(shù)據(jù)流中的第 K 大元素

第K大用最小堆,返回的是第K大個元素

代碼如下:

from?heapq?import?*

class?KthLargest:

????def?__init__(self,?k:?int,?nums:?List[int]):

????????self.k?=?k

????????self.que?=?nums

????????heapify(self.que)

????????#while?len(self.nums)>self.k:?#cut?heap?to?size:k

????????????#heappop(self.nums)



????def?add(self,?val):

????????"""

????????:type?val:?int

????????:rtype:?int

????????"""

????????heapq.heappush(self.que,?val)

????????while?len(self.que)?>?self.k:

????????????heapq.heappop(self.que)


????????return?self.que[0]


#?Your?KthLargest?object?will?be?instantiated?and?called?as?such:

#?obj?=?KthLargest(k,?nums)

#?param_1?=?obj.add(val)


2、多路歸并

利用最小堆,完成有序序列的歸并排序,666,還得看。。。。

代碼如下:

#?Definition?for?singly-linked?list.

#?class?ListNode:

#?????def?__init__(self,?val=0,?next=None):

#?????????self.val?=?val

#?????????self.next?=?next

class?Solution:

????def?mergeKLists(self,?lists:?List[ListNode])?->?ListNode:



????????import?heapq

????????d=ListNode(0)

????????p=d

????????head=[]

????????for?i?in?range(len(lists)):


??????????????if?lists[i]?:

??????????????????heapq.heappush(head,(lists[i].val,i))

??????????????????lists[i]=lists[i].next


????????while?head:


??????????????val,i=heapq.heappop(head)

??????????????p.next=ListNode(val)

??????????????p=p.next

??????????????if?lists[i]:

??????????????????heapq.heappush(head,(lists[i].val,i))

??????????????????lists[i]=lists[i].next

????????return?d.next

(2)不斷的兩路歸并到K路?。。?/p>

代碼如下:

#?Definition?for?singly-linked?list.

#?class?ListNode:

#?????def?__init__(self,?val=0,?next=None):

#?????????self.val?=?val

#?????????self.next?=?next

class?Solution:

????def?mergeKLists(self,?lists:?List[ListNode])?->?ListNode:


????????#merge兩個有序鏈表

????????def?merge(s,t):

????????????r=ListNode(0)

????????????p=r


????????????if?not?s?and?not?t:

????????????????return?

????????????if?not?s?:

????????????????return?t

????????????if?not?t:

????????????????return?s

????????????while?s?and?t:

????????????????if?s.val<t.val:

????????????????????r.next=s

????????????????????s=s.next

????????????????else:

????????????????????r.next=t

????????????????????t=t.next

????????????????r=r.next

????????????if?not?s:

????????????????????r.next=t

????????????if?not?t:

????????????????????r.next=s

????????????return?p.next

????????l=[]

????????k=len(lists)

????????print(k)

????????if?k==0:

????????????return?

????????if?k==1:

????????????return?lists[0]

????????for?i?in?range(k-1):

????????????l=merge(lists[i],lists[i+1])

????????????lists[i+1]=l

????????return?l

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容