找出N个数中最大的K个不同的浮点数

找出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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值