题目为输入n个元素找出这n个元素中最小的k个元素:如n=8,元素依次为1 2 3 4 5 6 7 8 则小的4的元素为1 2 3 4
下面上代码,解决方法见解题报告
/*
解题报告:
1、最简单的办法,给所有数据按升序或降序排序,从中取出相应的k个就可以了,最快的时间复杂度为nlog(n)
2、可以考虑维护一个堆,这个堆的中元素的个数为k,然后遍历元素,这时有两种情况:
1、堆中元素的个数小于k,这时直接插入即可
2、元素的个数为k,这时如果遍历到的元素小于堆中最大的那个元素就将堆中的这个元素删除,将遍历到的元素插入即可
*/
#include <iostream>
#include <set>
#include <vector>
using namespace std;
typedef multiset<int, greater<int> > intHeap;
void FindNumbers(vector<int> &data, int k, intHeap &numbers)
{
numbers.clear();
if (0==k || data.size()<k)
return ;
vector<int>::const_iterator iter = data.begin();
for (; iter!=data.end(); iter++)
{
if (numbers.size() < k)
{
numbers.insert(*iter);
}
else
{
intHeap::iterator heapIter = numbers.begin();
if (*iter < *(numbers.begin()))
{
numbers.erase(heapIter);
numbers.insert(*iter);
}
}
}
}
int main()
{
int n;
vector<int> data;
intHeap numbers;
while (cin>>n)
{
for (int i=0; i<n; ++i)
{
int nTemp;
cin>>nTemp;
data.push_back(nTemp);
}
FindNumbers(data, 4, numbers);
intHeap::const_iterator iter = numbers.begin();
for (; iter!=numbers.end(); ++iter)
{
cout<<*iter<<" ";
}
cout<<endl;
}
return 0;
}