题目描述:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
解读:
- 首先想到的就是利用排序的方式,将整个数列从小到大排序,从排序后的数列中就能得到最小的K个数
- 利用STL容器中Partition算法可以使得把数列按照大于和小于平均值分成两部分放在左右两边并且可以得到中间数据的位置,这样就可以利用这种算法,进行多次操作,首先如果求得第一次的中间数据位置大于K-1(从0开始的话),那么说明我们求得的位置值大了(如果小于K-1,那么说明我们求得的位置值小了),继续在该位置的左边进行相同的操作(但是此时操作的数列起始和末尾位置是上次的起始位置和求得到的中间数据的位置),继续求得一个中间数据的位置,进行判断与K的大小比较,一直下去总能找到一个等于K-1的值,这样求得K-1的位置之后,第k-1和包括左边位置的所有元素都是我们所要求的数据。
代码:
/*方法1*/
class solution
{
public:
vector<int> LeastNumbers(vector<int> input, int k)
{
sort(input.begin(),input.end());
vector<int> result;
for(int i=0;i<k;i++)
{
result.push_back(input[i]);
}
return result;
}
}
/*方法2*/
class solution
{
public:
vector<int> LeastNumbers(vector<int> input, int k)
{
int length=input.length();
int start=0;
int last=length-1;
int index=0;
vector<int> result;
index=partition(input,start,last);
while(index!=k)
{
if(index>k)
{
end=index;
index=partition(input,start,last);
}
else
{
start=index;
index=partition(input,start,last);
}
}
for(int i=0;i<k;i++)
{
result.push_back(input[i]);
}
return result;
}
}