尋找最小的k個數(大頂堆方法)

2022-08-15 18:18:19 字數 810 閱讀 5635

題目描述:查詢最小的k個元素,輸入n個整數,輸出其中最小的k個。

一般的排序方法,如快排,時間複雜度為o(n*logn+k);

大頂堆方法,時間複雜度為o(k+(n-k)*logk);

如果建立k個元素的最小堆的話,那麼其空間複雜度勢為o(n),而建立k個元素的最大堆的空間複雜度為o(k);

當面對海量資料處理的時候,大頂堆的方法是較為靠譜的,並且可以在面試時短時間內完成**。

1

class

solution 910

void heapadjust(vector &input,int i,int

k)11

22if(input[rightchild] > input[max] && rightchild <=k)

2326

if(max!=i)

2731}32

}3334void buildheap(vector &input,int

k)3540}

4142 vector getleastnumbers_solution(vector input, int

k) 54

55buildheap(temp,k);

5657

for(int i = k+1;i <= len;i++)

5864}65

66for(int i = 0;i < k;i++)

6770

return

result;71}

72 };

ps:類似快速排序的partition過程,時間複雜度可以做到o(n)。

尋找最小的k個數

尋找最小的k個數 在乙個長度為n的陣列中,尋找最小的k個數。最大的k個數解法類似 想法比較簡單,先對n個數排序,再輸入前面k個數,即可。這種方法的時間複雜度比較大。假設我們使用快排,需要o nlogn 然後輸出k個數需要o k 一共要o nlogn 略。這種方法比較好,演算法簡單,易於實現。先把陣列...

尋找最小的k個數

輸入n個整數,輸出其中最小的k個。要求乙個序列中最小的k個數,按照慣有的思維方式,則是先對這個序列從小到大排序,然後輸出前面的最小的k個數。至於選取什麼的排序方法,我想你可能會第一時間想到快速排序 我們知道,快速排序平均所費時間為n logn 然後再遍歷序列中前k個元素輸出即可。因此,總的時間複雜度...

尋找最小的 k 個數

輸入n個整數,輸出其中最小的k個。使用排序的方法來解決該問題。快速排序所費時間複雜度為o n logn 排序完成過後,只需要取前k個數值即是最小的k個數。int array const int length sizeof array sizeof array 0 void printarray in...