堆結構解決劍指OFFER 最小的K個數問題

2021-10-05 09:43:21 字數 1653 閱讀 4004

題目描述:

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

題目解答:

分析:題目需求為找出n個整數中最小的k個數,考慮使用小頂堆,選k個元素組成乙個小頂堆,那麼遍歷剩下的n-k個元素的時候,如果當前遍歷元素大於堆頂元素,該元素還需要繼續與小頂堆內的其他元素比較,最差的情況是最初的k個元素就是n個整數中最小的k個數,那麼該元素與小頂堆內最後乙個元素比較完,該元素大於小頂堆內所有的元素,那麼這次比較就是徒勞的,這樣效能非常差;考慮使用大頂堆,如果當前遍歷的元素大於堆頂元素,直接進行下乙個遍歷,如果當前遍歷元素小於堆頂元素,用該元素替換堆頂元素,再進行大頂堆的調整。

public arraylist

getleastnumbers_solution

(int

input,

int k)

//用陣列去模擬k個節點的堆結構

int[

] maxheap =

newint

[k];

//初始化堆中元素

//public static void arraycopy(object src, int srcpos, object dest, int destpos, int length):其中src-原陣列,srcpos-從原陣列的該位置開始,dest-目標陣列,destpos-從目標陣列的該位置開始,length-要copy的長度

system.

arraycopy

(input,

0,maxheap,

0,k)

;//從非葉子節點開始,調整堆

for(

int i = k/2-

1;i>=

0;i--

)//遍歷len-k個元素

for(

int i = k;i//將大頂堆的節點元素進行公升序操作

//將堆頂元素和最後乙個元素交換,將除最後乙個元素外的大頂堆進行堆維護,重複進行

for(

int i = maxheap.length-

1;i>

0;i--

) arraylist

ans =

newarraylist

<

>()

;for

(int i =

0;i)return ans;

}//從index位置開始,將maxheap陣列內的元素調整為大頂堆

private

void

initiate

(int index,

int[

] maxheap,

int length)

if(maxheap[k]

> temp)

else

}//找到最終位置,才進行值的更新

maxheap[index]

= temp;

}

**部分需要好好理解大頂堆的調整過程,如何將起始調整的元素找到最終的位置安放!再就是如何將乙個大頂堆從小到大輸出,如何對大頂堆進行公升序調整!

若是top k問題,則考慮使用小頂堆,思路如上分析所述。

最小的k個數(大根堆法) 劍指Offer

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,這個題主要是通過構建大根堆來實現的,首先構建大小為k的大根堆,這樣陣列中最大的k個數就在其中,然後和陣列中的其他樹進行比較 如果陣列中的數 大根堆堆頂,那麼將這個數和大根堆堆頂進行...

劍指offer 最小k個數

1.題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,2.方法 1 基於堆排序演算法,構建最大堆。時間複雜度為o nlogk 2 如果用快速排序,時間複雜度為o nlogn 3 如果用插入排序,時間複雜度為o n 2 3.演...

劍指offer 最小的K個數

華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 10 4 題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,解析 基於插入排序的思想可以想到使用乙個長度為k的排序陣列儲存最小的k個元素,複雜度o nk 基於...