题目:输入n个整数,输出其中最小的k个。
思路二:不能修改原数组,则需要开辟一个能装k个元素的容器,每再来一个元素,和已有的元素中最大的替换,如果大于等于最大的,舍弃之
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
方法一:如果可以修改原来数组的元素,则利用快排的partition算法,可以把较小的k个元素,划分到前面去
int Partition(vector<int> &data,int start, int end)
{
int i=start,j=end;
while (i<j)
{
while (i < j && data[i] <= data[j]) j--;
if(data[i]>data[j])
{
swap(data[i],data[j]);
i++;
}
while (i < j && data[i] <= data[j]) i++;
if(data[i]>data[j])
{
swap(data[i],data[j]);
j--;
}
}
return i;
}
void GetLeastKNum(vector<int> &input,int n,vector<int> &output,int K)
{
if(n<K || n<=0 || K<=0) return;
int start = 0;
int end = n-1;
int index = Partition(input,start,end);
while (index != K-1)
{
if(index > K-1)
{
end = index - 1;
index = Partition(input,start,end);
}
else
{
start = index + 1;
index = Partition(input,start,end);
}
}
for (int i = 0; i < K; ++i)
{
output.push_back(input[i]);
}
}
思路二:不能修改原数组,则需要开辟一个能装k个元素的容器,每再来一个元素,和已有的元素中最大的替换,如果大于等于最大的,舍弃之
如何能尽快的取出K个元素中最大的元素,可以利用标准库的set实现,其底层是利用红黑树实现,利用一个比较大于的谓词,可以实现set集合中的元素有序。例如: multiset<int,greater<int> > Kset; 则Kset中的元素第一个始终是最大的。
typedef multiset<int,greater<int> > Kset;
typedef multiset<int,greater<int> >::iterator setIterator;
void GetLeastKNum(vector<int>& data,Kset& Knum,int K)
{
Knum.clear();
int n = data.size();
if(K<=0 || n < K) return;
for (int i=0; i<n; ++i)
{
if(Knum.size()<K) Knum.insert(data[i]);
else
{
setIterator iter = Knum.begin();
if(*iter > data[i])
{
Knum.erase(iter);
Knum.insert(data[i]);
}
}
}
}