思路
使用一个容器,大小为K;用这个容器来保存这最大的或者最小的K个数。
如果是找最大的K个数,那么,每次和容器中的最小元素比较,如果最小的元素小于当前元素,那么删除这个最小的元素,同时将当前元素插入;
如果是找最小的K个数,那么就和容器中最大的元素比较。同理。
容器用哪个呢?
容器选择用set,set本身就是排序的,始终自动保持排序。那么用迭代器就可以找到最大或者最小的元素。
使用这种方法,时间复杂度为O(nlogK)。
注:
这是一种高效,又适合海量数据的方法,通用方法。
set说明
set是从小到大排序的。使用迭代器可以确定最大最小元素。
set<int> s;
auto iter=s.begin();//iter指向最小的值
auto iter=s.end();
--iter; // 此时iter指向最大的值
另外:set插入元素使用inset;
set删除元素,使用erase:s.erase(iter)
查找数组中最大的K个数
#include<iostream>
#include<set>
#include<vector>
using namespace std;
int main()
{
set<int> s;
vector<int> data;
for(int i=0;i<100;i++)
{
data.push_back(i);
}
for(int i=0;i<data.size();i++)
{
if(s.size()<5)
{
s.insert(data[i]);
}
else
{
auto iter=s.begin();
if(*iter<data[i])
{
s.erase(iter);
s.insert(data[i]);
}
}
}
for(auto re:s)
{
cout<<re<<endl;
}
return 0;
}