码迷,mamicode.com
首页 > 其他好文 > 详细

k个最小的数

时间:2018-05-19 00:09:34      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:span   遍历   AC   lse   最大值   color   code   multiset   result   

输入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; }

 

k个最小的数

标签:span   遍历   AC   lse   最大值   color   code   multiset   result   

原文地址:https://www.cnblogs.com/czy4869/p/9058414.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!