題目:
輸入n 個整數,輸出其中最小的 k 個。
例如輸入 1 , 2 , 3 , 4 , 5 , 6 , 7 ,8 這 8 個數字,則最小的 4 個數字為 1 , 2 , 3 和 4 。
分析:本題最簡單也最容易想到的解決方法就是把輸入的n個整數排序了。當然,排序也有好多種方法,是選擇排序、插入排序、快速排序還是堆排序?如果是堆排序還要分為是用大根堆還是小根堆?首先,我們當然會選擇時間複雜度較低(nlogn)的排序演算法了。
再仔細看下題目,題中好像沒有要求我們按大小順序輸出其中的最小的k個數!僅僅要求輸入這個k個數而已。這就提示我們不必對所有資料進行排序,只需找出這k個最小數而已。是不是選擇排序比較合適?只需要o(n*k)就可以找到最小的k個資料。在具體化些,我們只需申請k個大小的陣列儲存最後的結果,如果陣列未填滿,我們就直接將輸入的元素放入到陣列中;如果陣列中放滿了k個元素,那麼我們就需要找到當前陣列中最大的元素值與剛輸入的整數值比較,如果剛輸入的整數值較小,則進行替換,否則繼續輸入……
查詢k個元素陣列的最大值時間複雜度為o(k),需要進行n-k次,所以時間複雜度是o(k(n-k)),最後的平均複雜度應該是o(kn)。至於更多的思路當然還有採用具有k個元素的大根堆來實現,具體可以檢視july的詳細講解
**如下:
#include#include
#define size 10 //k=20
void replace(int datas,int newdata)
for(k=0;kgetchar();
return 0;
}對於上述**有些同學會不太懂,最起碼我剛開始是這樣的
最難懂的就是replace函式,我都以注釋介紹了。(ps:所有注釋都是本人自己新增的,就是為了像我這樣的小白更明白一些
對於此題還有更為詳細的解釋,參見:
微軟等資料結構與演算法面試100題 第五題
第五題 查詢最小的k個元素 題目 輸入n個整數,輸出其中最小的k個。例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。分析 本題目要求計算n個整數的最小的k個,題目沒有直接給出複雜度的要求,因此有很多種解法。比如排序後一次輸出等 很多種解法。如果是要求複雜度為klo...
查詢最小的k個元素 微軟面試100題 第五題
題目要求 輸入n個整數,輸出其中最小的k個。例如 輸入1,2,3,4,5,6,7,8這8個數字,則最小的4個數字為1,2,3,4。參考資料 劍指offer第30題。題目分析 解法一 用快排的思想,但是最小的k個數不用排序,時間複雜度o n 優點 時間複雜度好,缺點 會修改原整數陣列順序。解法二 建立...
微軟面試100題
41.求固晶機的晶元查詢程式 晶元盤由數目不詳的大小一樣的晶元組成,晶元並不一定全布滿晶元盤,照相機每次這能匹配乙個晶元,如匹配過,則拾取該晶元,若匹配不過,照相機則按測好的晶元間距移到下乙個位置。求遍歷晶元盤的演算法 求思路。兩個非降序鍊錶的並集,1 2 3 和 2 3 5 並為 1 2 3 5 ...