k个最小的数

输入n个整数,输出k个最小的数。例如输入4,5,1,6,2,7,3,8这8个数,则最小的4个数字是1,2,3,4。利用堆排序

(1)遍历数组,将前k个数插入到堆中,使用multiset来实现堆
(2)继续从输入数组中读入元素,作为待插入的整数,并将它与堆中的最大值进行比较,若待插入的值比这个最大值小,则用它替换最大值,否则抛弃这个数,继续读取下一个数.动态的维护堆中的数都是最小的,最后输出堆即可.
multiset和set的区别是multiset允许元素重复.
如果本题变为求k个最大的数,则将最大堆变为最小堆,并且继续从输入数组中读入元素,作为待插入的整数,将它与堆中的最小值进行比较,若待插入的值比这个最小值大,则用它替换最小值,否则抛弃这数,继续读取下一个数,动态的维护堆中的数都是最大的,最后输出堆即可.
vector<int> GetLeastNumber(vector<int> input,int k) { vector<int> result; int lenth=input.size(); if(input.empty()||lenth<k||k<=0) { return result; } multiset<int,greater<int>> leastnumber;
multiset
<int,greater<int>> ::iterator itergreater;
vector
<int> ::iterator iter=input.begin(); for(;iter!=input.end();++iter) { if(leastnumber.size()<k) { leastnumber.insert(*iter); } else { itergreater=leastnumber.begin(); if(*iter<*itergreater) { leastnumber.erase(itergreater); leastnumber.insert(*iter); } } } for(iter=leastnumber.begin();iter!=leastnumber.end();++iter) { result.push_back(*iter); } return result; }

 

转载于:https://www.cnblogs.com/czy4869/p/9058414.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值