查詢最小的k個元素 微軟面試100題 第五題

2021-06-26 19:05:18 字數 1872 閱讀 8684

題目要求:

輸入n個整數,輸出其中最小的k個。

例如:輸入1,2,3,4,5,6,7,8這8個數字,則最小的4個數字為1,2,3,4。

參考資料:劍指offer第30題。

題目分析:

解法一:

用快排的思想,但是最小的k個數不用排序,時間複雜度o(n).

優點:時間複雜度好,缺點:會修改原整數陣列順序。

解法二:

建立乙個大小為k的最大堆,遍歷一遍陣列,同時不斷修改最大堆。時間複雜度o(nlogk).

優點:不會修改原陣列,適用於海量資料。缺點:比解法一時間複雜度高。

其他解法:

1.快排,取前k個數,時間複雜度o(nlogn).

2.遍歷k次,時間複雜度o(k*n).

3.點陣圖排序,取前k個數,時間複雜度o(n).會占用額外的空間.

解法一**:

#include #include using namespace std;   

inline int my_rand(int low, int high)

int partition(int a, int low, int high)

else

return true ;

}

int main()

;

int numofarray = sizeof (array1) / sizeof( int);

for(int i=0; i解法二**:

//從頭實現乙個最大堆需要一定的**,可以採用c++中的紅黑樹來實現。

//其中set和multiset都是基於紅黑樹實現的,後者可以支援陣列中有重複

#include #include #include using namespace std;

typedef multiset> intset;

typedef multiset>::iterator setiterator;

void getleastnumbers(const vector&data,intset &leastnumbers,int k);

int main(void)

; const vectordata(a,a+8);//8不是7

intset leastnumbers;

int k = 5;

getleastnumbers(data,leastnumbers,k);

cout << "最小的" << k << "個數為:";

setiterator iter = leastnumbers.begin();

for(;iter!=leastnumbers.end();++iter)

cout << *iter << " ";

cout << endl;

return 0;

}void getleastnumbers(const vector&data,intset &leastnumbers,int k)}}

}

微軟面試一百題之5 查詢最小的 k 個元素

5.查詢最小的 k 個元素 題目 輸入 n 個整數,輸出其中最小的 k 個。例如輸入1,2,3,4,5,6,7 和8 這8 個數字,則最小的4 個數字為1,2,3 和4。基本思路 使用堆排序基本思想,對堆排序做小小修改,在堆排序的演算法中增加乙個變數k,表示只需要最小的k個數。那麼意味著在最初的小根...

微軟面試題系列(五) 查詢最小的 k 個元素

好了,斷續微軟面試題的學習!看到題目,我首先想到的是樹狀陣列,後來看ppt才發現用樹狀陣列可以實現查詢第k大的元素,細想一下和這道題也差不多。網上的很多實現都是用堆做的,用堆大多數也是用c 的stl,multiset來實現。網上 很多,而且我也沒弄明白這題,先就不自己寫 了。在這裡,給出乙個o n ...

查詢最小的k個元素

題目 輸入n個整數,輸出其中最小的k個。演算法思想,要是將n個數排序然後輸出前k個,方法很簡單,但計算量比較大,為o nlogn 要是新建乙個有k個元素陣列,在陣列不滿時,將每乙個輸入的資料存入陣列。若陣列滿了,則比較輸入的資料與陣列中最大元素的大小,來決定接下來幹什麼,接下來幹什麼,我語言表達能力...