找出N个数中最大的K个不同的浮点数。比如,含有十个浮点数的数组(1.5,1.5,2.5,2.5,3.5,3.5,5,0,-1.5,3.5)中最大的三个不同的浮点数是(5,3.5,2.5)
由于是找出不同的数,我想到用标准模板库中的容器set,它既可以去重,又可以自动实现元素的排序。维护一个只有K个元素的set,set中始终维护目前最大的K和元素,遍历N个数时,将元素a[i]与set中最小的元素(即第一个元素)进行比较,如该元素不在set中且大于set中最小的元素,则将set中最小的元素删除,将a[i]插入到set中,这样遍历完毕后,set中剩下的K个元素即为所求。
#include <iostream>
#include <set>
using namespace std;
int main(){
float a[]={1.5,1.5,2.5,2.5,3.5,3.5,5,0,-1.5,3.5};
set<float>Knum;
set<float>::iterator iter;
int num;
cout<<"Input the num:";
cin>>num;
if ((num > 10)||(num < 0))
{
return -1;
}
for (int i = 0;i < 10;i++)
{
if (Knum.size()<num)
{
Knum.insert(a[i]);
}
else
{
iter = Knum.begin();
if (*iter < a[i] && (Knum.count(a[i]) == 0))
{
Knum.erase(iter);
Knum.insert(a[i]);
}
}
}
for (iter = Knum.begin();iter != Knum.end();iter++)
{
cout<<(*iter)<<endl;
}
system("pause");
return 0;
}
程序经过验证是正确的。该题来源于《编程之美》2.5的扩展问题2