最小的K個數

2021-08-21 16:59:38 字數 993 閱讀 9067

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

對元素排序,取前k個元素,即為最小的k個數,當k大於元素個數時,返回空

class solution 

};

時間複雜度:o(nlogn)

取前k個數,從小到大排序

對於剩下的n-k個數,遍歷,如果小於k個數中的最大值,該數代替最大值,並保持排序狀態

此處感謝aff ''指出錯誤,現已改正

class solution 

}return result;}}

;

時間複雜度:o((n-k) k logk)

利用堆排序,o(n logk),適合處理海量資料

遍歷輸入陣列,將前k個數插入到推中;(利用multiset來做為堆的實現)

繼續從輸入陣列中讀入元素做為待插入整數,並將它與堆中最大值比較:如果待插入的值比當前已有的最大值小,則用這個數替換當前已有的最大值;如果待插入的值比當前已有的最大值還大,則拋棄這個數,繼續讀下乙個數。

這樣動態維護堆中這k個數,以保證它只儲存輸入陣列中的前k個最小的數,最後輸出堆即可。

class solution 

else}}

for(itergreater = leastnumbers.

begin()

;itergreater!=leastnumbers.

end();

++itergreater)

return result;}}

;

時間複雜度:o(n logk)

class solution 

while

(!q.

empty()

)return res;}}

;

最小的K個數

問題描述 給定的n個整數,計算其中最小的k個數。最直觀的解法莫過於將n個數按公升序排列後輸出前k個。但是就效率來看,這種方法並不是最理想的。一種改進方法是借助快速排序中對陣列的劃分,以第k個元素對陣列進行劃分,使得比第k個數字小的數字都在其左邊,比其大的數字都在它的右邊。void swap int ...

最小的K個數

從 陣列中出現次數超過一半的數字 得到啟發,同樣可以基於partition函式來解決。一 o n 演算法 void getleastnumbers int input,int n,int output,int k else for int i 0 i k i output i input i 二 o...

最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,如果不讓使用sort的話,自己實現乙個,或者依次選取最小的 class solution public vectorgetleastnumbers solution vectori...