找最大的N個數

2021-06-21 13:57:19 字數 1469 閱讀 5645

題目:找最大的n個數

時間限制1000 ms,記憶體限制256000 kb,**長度限制8000 b。

給定n個整數,找最大的前m個數(不一定有序),要求時間複雜度盡量低。

先輸入n和m (1 < = m < = n < = 50000)。然後下面n行每行代表乙個整數(每個整數在int範圍內),輸出有m行,每行乙個整數,表示最大的m個數。

輸入示例:

5程式設計題-找最大的n個數 3

5 4

3 2

1輸出示例: 5

4 3

分析:1、如果所有的資料都可以裝入記憶體,可以考慮使用快排中的分割函式partition(),找到前m個最大的數,此時的平均複雜度是o(n)。

[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個資料。...