題目要求:
輸入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個元素陣列,在陣列不滿時,將每乙個輸入的資料存入陣列。若陣列滿了,則比較輸入的資料與陣列中最大元素的大小,來決定接下來幹什麼,接下來幹什麼,我語言表達能力...