題目描述:
輸入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 基於...