輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
最簡單暴力的方法就是先用sort排序,然後在遍歷輸出最小的k個數。複雜度為o(n
logn
)o(nlog)
o(nlog
n)。還有一種更快,時間複雜度為o(n
logk
)o(nlog)
o(nlog
k)的方法:
我們可以先建立乙個大小為k的資料容器來儲存最小的k個數字,接下來我們每次從輸入的n個整數中的n個整數中讀入乙個數。如果容器中已有的數字少於k個,則直接把這次讀入的整數放入容器之中;如果容器已經有k個數字了,也就是容器滿了,此時我們不能再插入新的數字而只能替換已有的數字。找出這已有的k個數中的最大值,然後拿這次待插入的整數和最大值進行比較。如果待插入的值比當前已有的最大值小,則用這個數替換當前已有的最大值;如果待插入的值比當前已有的最大值還要大,那麼這個數不可能是最小的k個整數之一,於是我們可以拋棄這個整數。
因此當容器滿了之後,我們要做3件事情:一是在k個整數中找到最大數;二是有可能在這個容器中刪除最大數;三是有可能要插入乙個新的數字。如果用乙個二叉樹來實現這個資料容器,那麼我們在o(logk)時間內實現這三步操作。因此對於n個輸入數字而言,總的時間效率就是o(nlogk)。
優點:1)沒有修改輸入的資料。2)適合海量資料的輸入,對於資料量巨大到無法一次性讀取到記憶體的資料,採用這種方法,每次從硬碟讀取乙個數字進行操作就行。
class
solution
for(
int i =
0; i < length; i++
)else
//堆排序
for(
int j = k -
1; j >
0; j--)if
(input[i]
< result[k -1]
)}}return result;
}private
:void
heapadjust
(vector<
int>
&input,
int point,
int length)
if(temp >= input[i]
) input[point]
= input[i]
; point = i;
} input[point]
= temp;}}
;
劍指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 基於...
《劍指offer》最小的K個數
輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,輸入給整數陣列,和k 找出其中最小的k個數 class solution 1 先用插入排序對陣列中數進行排序。2 取出有序陣列中最小的kge。附 這只是乙個比較簡單的方法。如果考慮...