题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路:
1,维护一个小顶堆。最后依次弹出四个数字。
2,基于快排的思想,排序到第k个就返回。
快排:先固定一个哨兵,然后从high和low开始比。遇到a[high] <哨兵的就赋值给小的。然后low++;最后看low和high相等否
代码:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int size=input.size()-1; //尾
vector<int> res;
if(siez<0 }} input.size()<k) return res;
getthenumber(input,0,size,k);
for(int i=0;i<k;i++)
res.push_back(input[i]);
return res;
}
private:
void getthenumber(vector<int> &num, int l,int r,int k)
{
if(l<r)
{
int low =l,high=r;
int sentry=num[l];
while(low<high)
{
while(low<high && num[high]>sentry)
high--;
if(low<high)
num[low++]=num[high];
while(low<high && num[low]>sentry)
low++;
if(low<high)
num[high--]=num[low];
}
num[low]=sentry;
if(low+1==k)
return ;
else if(low+1>k)
getthenumber(num,l,low-1,k);
else
{
getthenumber(num,l,low-1,k);
getthenumber(num,low+1,r,k);
}
}
}