最小的K個數 C

2021-10-04 07:52:34 字數 1004 閱讀 2213

題目:

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

思路:1. 使用partition函式,當其返回的index為k-1時,前k位即最小的k個數字,時間複雜度為o(n),但是會修改原始陣列

**如下:

class solution 

else

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

result.push_back(input[i]);

return result;

}/*---------partition函式返回的位置之前的元素都小於該位置元素----------*/

int partition(vector&input, int len, int start, int end)

}++small;

swap(input[small], input[end]);

return small;

}/*-------生成start到end之間的隨機數---------*/

int randominrange(int start, int end)

};

2. 使用最大堆,將前k個數字放入最大堆中,接下來輸入的數字,如果比堆頂(最大數)小,則擦除堆頂,插入新數字,堆會自動排序,並將最大數字保持在堆頂,直到最後,堆中儲存著最小的k個數,時間複雜度為(o(nlogk)),但是不修改輸入,適用於海量資料

**實現:

class solution }}

/*---將結果儲存在result陣列中---*/

heapiter iter_heap = temp.begin();

for(; iter_heap != temp.end(); iter_heap++)

result.push_back(*iter_heap);

return result;

}};

最小的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...