題目:輸入n個整數,輸出其中最小的k個。
例如輸入1,2,3,4,5,6,7和這8個數字,則最小的4個數字為1,2,3和4。
分析:這道題最簡單的思路莫過於把輸入的n個整數排序,這樣排在最前面的k個數就是最小的k個數。只是這
種思路的時間複雜度為o(nlogn)。我們試著尋找更快的解決思路。我們可以開闢乙個長度為k的陣列。每次從輸
入的n個整數中讀入乙個數。如果陣列中已經插入的元素少於k個,則將讀入的整數直接放到陣列中。否則長度
為k的陣列已經滿了,不能再往陣列裡插入元素,只能替換了。如果讀入的這個整數比陣列中已有k個整數的最
大值要小,則用讀入的這個整數替換這個最大值;如果讀入的整數比陣列中已有k個整數的最大值還要大,則讀
入的這個整數不可能是最小的k個整數之一,拋棄這個整數。這種思路相當於只要排序k個整數,因此時間複雜
度可以降到o(n+nlogk)。通常情況下k要遠小於n,所以這種方法要優於前面的思路。
從上面的分析,當長度為k的陣列已經滿了之後,如果需要替換,每次替換的都是陣列中的最大值。在常用
的資料結構中,能夠在o(1)時間裡得到最大值的資料結構為最大堆。因此我們可以用堆(heap)來代替陣列。
stl中的set和multiset為我們做了很好的堆實現,我們可以拿過來用。
#include #include #include using namespace std;
typedef multiset> intheap;
/* 在vector裡查詢最小的k個數 */
void findkleastnumbers
( const vector& data, // 輸入的資料
intheap& leastnumbers, // 輸出的k個最小的數
unsigned int k
) }
}}
查詢最小的k個元素
題目 輸入n個整數,輸出其中最小的k個。演算法思想,要是將n個數排序然後輸出前k個,方法很簡單,但計算量比較大,為o nlogn 要是新建乙個有k個元素陣列,在陣列不滿時,將每乙個輸入的資料存入陣列。若陣列滿了,則比較輸入的資料與陣列中最大元素的大小,來決定接下來幹什麼,接下來幹什麼,我語言表達能力...
查詢最小的k個元素
查詢最小的k個元素 題目 輸入n個整數,輸出其中最小的k個。例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。1 輸入元素,並排序 2 輸出前k個元素 排序 採用高效的排序方法,如 快速排序,歸併排序等 方法一 採用最簡單的方法 include include in...
查詢最小的k個元素
題目 輸入n個整數,輸出其中最小的k個數 例如 1 2 3 4 5 6 7 8 這8個數字,則最小的4個數字為1,2,3,4,第一種 直接對其先排序,再取頭幾個數 這樣最快是nlogn 快排或者堆排 include using namespace std void partsort int a,in...