方法一:利用快排的思想,循环找到第k个位置安放正确的元素,此时k的左边是小于k位置元素的元素,右边是大于k位置元素的元素,即前k个元素就是问题答案。时间复杂度O(n)。
int Partition(vector<int> &res,int s,int e)
{
int tp=res[s];
while(s<e)
{
while(s<e&&res[e]>=tp)e--;
res[s]=res[e];
while(s<e&&res[s]<=tp)s++;
res[e]=res[s];
}
res[s]=tp;
return s;
}
void GetKNumbers(vector<int> res,int k)
{
int s=0,e=res.size()-1;
int index=Partition(res,s,e);
while(index!=k-1) //当k位置安放正确的时候,前k个元素就是最终结果
{
if(index>k-1)e=index-1;
else s=index+1;
index=Partition(res,s,e);
}
for(int i=0;i<k;i++)
cout<<res[i]<<" ";
}
方法二:利用堆排序的思想,若找前k小的元素,则构建大顶堆&#x