LintCode 堆化詳解及實(shí)例代碼
LintCode 堆化詳解及實(shí)例代碼
給出一個(gè)整數(shù)數(shù)組,堆化操作就是把它變成一個(gè)最小堆數(shù)組。
對(duì)于堆數(shù)組A,A[0]是堆的根,并對(duì)于每個(gè)A[i],A [i * 2 + 1]是A[i]的左兒子并且A[i * 2 + 2]是A[i]的右兒子。
樣例
給出 [3,2,1,4,5],返回[1,2,3,4,5] 或者任何一個(gè)合法的堆數(shù)組
挑戰(zhàn)
O(n)的時(shí)間復(fù)雜度完成堆化
說(shuō)明
什么是堆?
堆是一種數(shù)據(jù)結(jié)構(gòu),它通常有三種方法:push, pop 和 top。其中,“push”添加新的元素進(jìn)入堆,“pop”刪除堆中最小/最大元素,“top”返回堆中最小/最大元素。
什么是堆化?
把一個(gè)無(wú)序整數(shù)數(shù)組變成一個(gè)堆數(shù)組。如果是最小堆,每個(gè)元素A[i],我們將得到A[i * 2 + 1] >= A[i]和A[i * 2 + 2] >= A[i]
如果有很多種堆化的結(jié)果?
返回其中任何一個(gè)。
分析:一開(kāi)始想到堆化么肯定就是堆排序吧,粗粗一想貌似復(fù)雜度是O(nlgn),后來(lái)參考該文章才知道O(nlgn)是復(fù)雜度上限,平均是O(n)
代碼:
class Solution { public: /** * @param A: Given an integer array * @return: void */ void heapify(vector<int> &A) { // write your code here int n = A.size()-1; for(int i=n/2;i>=0;i--) heapify(A,i); } void heapify(vector<int> &A,int i) { int l = 2*i+1; int r = 2*i+2; int smallest = i; if(l<A.size()&&A[l]<A[smallest]) smallest = l; if(r<A.size()&&A[r]<A[smallest]) smallest = r; if(smallest!=i) { swap(A[i],A[smallest]); heapify(A,smallest); } } };
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)括號(hào)匹配的方法
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)括號(hào)匹配的方法,文中代碼簡(jiǎn)單易懂,方便大家更好的學(xué)習(xí),感興趣的朋友可以參考下2020-06-06C++實(shí)現(xiàn)病人就醫(yī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++語(yǔ)言實(shí)現(xiàn)病人就醫(yī)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01C語(yǔ)言動(dòng)態(tài)內(nèi)存分配圖文講解
給數(shù)組分配多大的空間?你是否和初學(xué)C時(shí)的我一樣,有過(guò)這樣的疑問(wèn)。這一期就來(lái)聊一聊動(dòng)態(tài)內(nèi)存的分配,讀完這篇文章,你可能對(duì)內(nèi)存的分配有一個(gè)更好的理解2023-01-01虛函數(shù)被類的構(gòu)造析構(gòu)函數(shù)和成員函數(shù)調(diào)用虛函數(shù)的執(zhí)行過(guò)程
虛函數(shù)被類的構(gòu)造析構(gòu)函數(shù)和成員函數(shù)調(diào)用虛函數(shù)的執(zhí)行過(guò)程,需要的朋友可以參考下2013-02-02C語(yǔ)言入門(mén)之淺談數(shù)據(jù)類型和變量常量
這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)類型和變量常量,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01Qt圖形圖像開(kāi)發(fā)之曲線圖表模塊QChart庫(kù)讀取/設(shè)置X軸的顯示區(qū)間
這篇文章主要介紹了Qt圖形圖像開(kāi)發(fā)之曲線圖表模塊QChart庫(kù)讀取/設(shè)置X軸的顯示區(qū)間,需要的朋友可以參考下2020-03-03