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

猜你喜欢

转载自www.cnblogs.com/czy4869/p/9058414.html