题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
首先考虑用一个堆去维护最小数的序列。可是c++中自己去实现一个堆感觉代码有点多了。看了下书上推荐用set。它的底层实现就是红黑树。代码如下。
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
multiset<int,greater<int> > intSet;
multiset<int,greater<int> >::iterator it;
vector<int> resultVect;
if(input.size()<k)
return resultVect;
int i;
for(i=0;i<k;i++)
{
intSet.insert(input[i]);
}
for(i=k;i<input.size();i++)
{
it=intSet.begin();
if(*it>input[i])
{
intSet.erase(it);
intSet.insert(input[i]);
}
}
for(it=intSet.begin();it!=intSet.end();it++)
{
resultVect.push_back(*it);
}
vector<int> res;
for(i=resultVect.size()-1;i>=0;i--)
{
res.push_back(resultVect[i]);
}
return res;
}
};
顺便学了下set的用法,因为平时用的比较少。
#include <iostream>
#include <set>
using namespace std;
struct newType{
int i;
char ch;
};
struct comp{
bool operator()(const newType &a,const newType &b)
{
return a.i<b.i;
}
};
set<newType,comp> element;
int main()
{
newType a,b,c;
a.i=1;
a.ch='a';
b.i=2;
b.ch='c';
c.i=3;
c.ch='b';
element.insert(a);
element.insert(b);
element.insert(c);
set<newType,comp>::iterator it;
for(it=element.begin();it!=element.end();it++)
{
cout<<(*it).i<<" ";
}
cout<<endl;
}