堆(heap)是乙個可以被看成近似完全二叉樹的陣列。樹上的每乙個結點對應陣列的乙個元素。除了最底層外,該樹是完全充滿的,而且是從左到右填充。
堆包括最大堆和最小堆:最大堆的每乙個節點(除了根結點)的值不大於其父節點;最小堆的每乙個節點(除了根結點)的值不小於其父節點。
堆常見的操作:
堆結構的乙個常見應用是建立優先佇列(priority queue)。
以下以 leetcode 堆問題進行分析
1046. 最後一塊石頭的重量
有一堆石頭,每塊石頭的重量都是正整數。
每一回合,從中選出兩塊最重的石頭,然後將它們一起粉碎。假設石頭的重量分別為 x 和 y,且 x <= y。那麼粉碎的可能結果如下:
最後,最多隻會剩下一塊石頭。返回此石頭的重量。如果沒有石頭剩下,就返回 0。
class
solution
if(stones.length ==2)
for(
int i = stones.length /2-
1; i >=
0; i--
)int temp = stones[1]
> stones[2]
? stones[1]
: stones[2]
;while
(temp !=0)
else
for(
int i =
2; i >=
0; i--
) temp = stones[1]
> stones[2]
? stones[1]
: stones[2]
;}return stones[0]
;}public
void
adjustheap
(int
arr,
int i,
int length)
if(arr[k]
> temp)
else
} arr[i]
= temp;
}}
資料結構 堆專題總結
專題主要內容 堆的概念 性質 堆的建立 堆的插入 刪除 堆的應用 堆的概念 堆 heap 這裡所說的堆是資料結構中的堆,而不是記憶體模型中的堆。堆通常是乙個可以被看做一棵樹,它滿足下列性質 性質一 堆中任意節點的值總是不大於 不小於 其子節點的值 性質二 堆總是一棵完全樹。將任意節點不大於其子節點的...
資料結構之堆
原帖 對於堆的資料結構的介紹,在網上搜了下,具體講的不是很多。發現比較好的一篇介紹堆的部落格是在此感謝他。通過對上面那篇部落格的學習,然後自己也去翻了下 演算法導論 裡面關於堆排序 heapsort 的介紹。這樣就對堆有了更加深刻的認識,在此,我結合自己的一點點理解,主要還是基於上面那篇部落格的內容...
資料結構之堆
堆 我們這裡指二叉堆 是一棵完全二叉樹,並且祖先節點的所有子孫節點都不小於 或不大於 祖先節點的值。通常我們把根節點作為第一層的話,那麼深度為h的堆就有2 h 1 2 h 1個節點,顯然擁有n個節點的堆,其高度為lgn。也就是說對堆進行插入語刪除操作我們都需要lgn的時間。由於堆的完全樹的性質,因此...