根據堆的性質之一——堆中某個節點的值總是不大於或不小於其父節點的值,可以將堆分為大根堆(最大堆)與小根堆(最小堆)。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。
注:堆的根節點中存放的是最大或者最小元素,但是其他節點的排序順序是未知的。
假設現在有乙個小根堆,並且根的元素名為root,其左右子節點為left和right,此時插入乙個新的元素,這種情況下,有兩種可能:
(1)root<=left並且root<=right,即根節點比它的左右子節點都小,則說明此時就是最小堆;
(2)root>left或者root>right,此時root應與兩個左右子節點中值較小的乙個交換,結果得到乙個堆,這個時候,如果root的值仍然大於其新的左右節點的乙個或全部的兩個的值,則重複上一步操作,繼續和新的左右子節點中較小的值交換,即之前提到的堆的基本操作中的下沉操作(如果是最大堆則情況相反,相應的就是上浮操作)。重複這個過程,直至到達某乙個層使它小於它所有子節點,或者它成了葉子結點。
根據前面堆的性質,我們知道堆的根節點存放的一組資料中最大或者最小的元素。所以堆經常用來解決topk問題。比如leetcode中的前 k 個高頻元素,陣列中的第k個最大元素等。
還有比如:如何從100萬個數中找出最大的前100個數。我們可以先取出前100個數,對這100個數構建乙個最小堆。然後遍歷一遍剩餘的元素,在此過程中維護這個最小堆就可以了。
步驟:
leetcode刷題之堆
今天終於開啟的第二個專題的刷題之旅堆,不過第乙個專題棧還有乙個小問題沒解決就是利用遞減棧去解決接雨水的問題,雖然那道題我用動態規劃的問題解決出來了,我記得看到過一道面試題,問棧和堆有什麼區別。通過搜尋網上的資料總結如下。棧 stack 由系統分配記憶體,速度較快,但是自己無法掌握。堆 一般用兩種方法...
LeetCode刷題筆記 七)反轉整數
題目 給定乙個 32 位有符號整數,將整數中的數字進行反轉。示例 1 輸入 123 輸出 321示例 2 輸入 123 輸出 321示例 3 輸入 120 輸出 21 注意 假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 231,231 1 根據這個假設,如果反轉後的整數溢位,則返回 0。...
Rrui的Leetcode演算法刷題筆記(七)
注 本頁有一定量的鎖定題,由於本人非常窮,所以本頁的題較少。318.maximum product of word lengths 注 簡單題,不解釋,浪費時間。faster than 100.00 326.power of three class solution return true 注 簡單...