使用乙個容器,大小為k;用這個容器來儲存這最大的或者最小的k個數。
如果是找最大的k個數,那麼,每次和容器中的最小元素比較,如果最小的元素小於當前元素,那麼刪除這個最小的元素,同時將當前元素插入;
如果是找最小的k個數,那麼就和容器中最大的元素比較。同理。
容器用哪個呢?
容器選擇用set,set本身就是排序的,始終自動保持排序。那麼用迭代器就可以找到最大或者最小的元素。
使用這種方法,時間複雜度為o(nlogk)。
注:這是一種高效,又適合海量資料的方法,通用方法。
set是從小到大排序的。使用迭代器可以確定最大最小元素。
set<
int> s;
auto iter=s.
begin()
;//iter指向最小的值
auto iter=s.
end();
--iter;
// 此時iter指向最大的值
另外:set插入元素使用inset;
set刪除元素,使用erase:s.erase(iter)
#include
#include
#include
using
namespace std;
intmain()
for(
int i=
0;isize()
;i++
)else}}
for(
auto re:s)
return0;
}
查詢最小的K個數
輸出最小的k個數 方案1 如果輸入的陣列可變,我們可以借助partion部分排序的思想,隨機選k值,經過排序後,k左邊的數都比k小,k右邊的數都比k大,這樣經過排序後,在k左邊的數字就是最小的k個數 int partion int a,int n,int left,int right if left...
查詢最小的k個數
乙個整型陣列,有n個元素,可以含有重複元素。查詢該陣列中最小的k個數。1 對陣列快速排序,然後從前往後依次挑出最小的k個元素,時間複雜度 nlogn k nlogn 2 設定乙個容量是 k 的臨時陣列,掃瞄目的陣列,如果臨時陣列元素個數小於k,直接填入臨時陣列,如果臨時陣列元素個數大於k,找出臨時陣...
查詢n個數中最小的k個元素
求n個數中最小的k個元素 n很大,k相對較小 建立乙個k個元素的堆 再逐個插入,最壞情況時間複雜度為o nlgk include 求左右葉子 父結點的巨集定義 define left i i 2 define right i i 2 1 define parent i i 2 維持堆的性質 演算法原...