九章演算法 猿輔導面試題 堆化

2021-10-21 16:59:11 字數 1362 閱讀 3987

描述

給出乙個整數陣列,堆化操作就是把它變成乙個最小堆陣列。

對於堆陣列a,a[0]是堆的根,並對於每個a[i],a [i * 2 + 1]是a[i]的左兒子並且a[i * 2 + 2]是a[i]的右兒子。

lintcode 領扣

說明

什麼是堆?什麼是堆化?如果有很多種堆化的結果?

樣例

輸入 : [3,2,1,4,5] 

輸出 : [1,2,3,4,5]

解釋 : 返回任何乙個合法的堆陣列

heapify 的具體實現方法。時間複雜度為o(n)o(n),使用的是 siftdown 之所以是 o(n) 是因為從第 n/2 個位置開始往下 siftdown,那麼就有大約 n/4 個數在 siftdown 中最多交換 1 次,n/8 個數最多交換 2 次,n/16 個數最多交換 3 次。 所以o(n/4∗1+n/8∗2+n/16∗3+...+1∗logn)=o(n)

class

solution

:"""

@param: a: given an integer array

@return: nothing

"""def

heapify

(self,a

):foriin

range

(len(a

)//2,

-1,-

1):self

.siftdown(a

,i)def

siftdown

(self,a

,index):n

=len(a

)while

index

left

=index*2

+1right

=index*2

+2minindex

=index

ifleft

<

nanda[

left

]minindex

]:minindex

=left

ifright

<

nanda[

right

]minindex

]:minindex

=right

ifminindex

==index

:breaka[

minindex],a

[index]=

a[index],a

[minindex

]index

=minindex

更多題解參考:九章演算法官方題解

九章演算法 Google面試題 內積

描述 給定長度為n的a陣列,長度為k的b陣列 你可以從a陣列裡取k個數 規則如下 即每次可以從a陣列的最左邊或者最右邊取走乙個數,取走的數從陣列中移除 將取出的ai按取出的順序組成c陣列 求b與c的內積最大值 b與c內積為 i 0k 1bi ci 解釋1 a 1,4,3,2,5 b 1,2,3,4 ...

九章演算法面試題32 小球排序

有紅黃藍三色的小球若干排成一列,這些小球進行排序,請使用盡量少的空間和時間。假設順序為紅色黃色藍色。用兩根指標從頭開始遍歷,第一根指標遇到非紅色時停下,如果第二根指標找到第一根指標之後的第乙個紅色停下,交換兩根指標所指顏色。重複上述過程。直到第二根指標找不到任何紅色。此時第一根指標到最後都是黃色或藍...

九章演算法面試題33 陣列波峰

乙個陣列a 1.n 假設陣列中沒有任何相鄰兩數相等,滿足a 1 n。a i 被稱為波峰,當且僅當a i a i 1 並且a i a i 1 請找到陣列中的乙個波峰。假設陣列中存在相鄰相等的數,該怎麼做?根據條件a 1 a n 可知a中一定存在波峰。用二分法,選擇中點mid,如果a mid 是波峰,則...