題目:找最大的n個數
時間限制1000 ms,記憶體限制256000 kb,**長度限制8000 b。分析:1、如果所有的資料都可以裝入記憶體,可以考慮使用快排中的分割函式partition(),找到前m個最大的數,此時的平均複雜度是o(n)。給定n個整數,找最大的前m個數(不一定有序),要求時間複雜度盡量低。
先輸入n和m (1 < = m < = n < = 50000)。然後下面n行每行代表乙個整數(每個整數在int範圍內),輸出有m行,每行乙個整數,表示最大的m個數。
輸入示例:
5程式設計題-找最大的n個數 3
5 4
3 2
1輸出示例: 5
4 3
[cpp]view plain
copy
void
getgreatestnum(
int*input,
intn,
int*output,
intk)
for(
inti = 0; i < k; ++ i)
output[i] = input[i];
} void
swap(
int*a,
int*b)
intpartition(
int*data,
intlength,
intstart,
intend)
} ++ small;
swap(&data[small], &data[end]);
return
small;
}
2、如果是大資料的情況,要考慮使用小頂堆來實現,每次比較堆頂元素和新元素的大小,若堆頂元素小,交換兩元素,重建最小堆。此時的複雜度為o(n log m)。stl容器中set、multiset是基於紅黑樹來實現的,可以直接用其來實現最小堆。
[cpp]view plain
copy
#include
#include
void
getgreatestnumber()
else
} } std::multiset, std::less<
int> >::reverse_iterator riter;
for(riter = minheap.rbegin();
riter != minheap.rend();
++ riter)
fclose(file);
}
ps:有道,機試,2013,校招
參考:《劍指offer》
N個數中找出最大的K個數
題目描述 有很多個 n個 無序的數,我們姑且假定它們各不相等,怎麼選出其中最大的若干個 k個 數呢?1.n 100,k 10的時候怎麼處理?2.n 1000,k 100呢?3.n 1億億個,k 100呢?如果這些數是整數的話,怎麼處理?如果是浮點數呢?如果這些數是整數,並且存在上界呢?如果將題目中的...
N個數裡面找出最大的k個數
出處 題目 給出n個無序的數,然後找出其中最大的k個數 解題思路 首先測試資料有可能會有一億個數,資料量特別的大,資料庫不可能儲存這麼多的資料。如果直接sort排序,nlogn時間複雜度實在是太高,大於10 9。我們可以考慮對資料進行分塊讀取,每次讀取的資料塊大小應大於k。不如先假設第一次讀取的資料...
資料結構 面試題 找N個資料中最大的K個資料
如果不限定條件的話,這個問題還是很好解決的,但是當我們要求時間複雜度為o n 空間複雜度為o 1 時,問題就沒那麼好解決了。簡單的思路就是,建立乙個大小為k 100的小堆,調整好,然後從k開始拿十萬個資料乙個乙個跟堆頭比較,如果比堆頭大,就入堆,然後調整成最小堆,一直迴圈到第n 100000個資料。...