劍指Offer 最小的K個數

2021-09-29 07:21:02 字數 1256 閱讀 3282

輸入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。附 這只是乙個比較簡單的方法。如果考慮...