题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> res;
if(input.size()<=0) return res;
int index=topk(input,0,input.size()-1,k);
for(int i=0;i<=index;i++){//记得带上等号
res.push_back(input[i]);
}
return res;
}
int partion(vector<int> &a,int left,int right){//快排的partition函数
int temp=a[left];
while(left<right){
while(left<right&&a[right]>temp) right--;
a[left]=a[right];
while(left<right&&a[left]<=temp) left++;
a[right]=a[left];
}
a[left]=temp;
return left;
}
int topk(vector<int> &a,int left, int right, int k){//寻找topk的位置
int index = -1;
if(left <= right){//考虑特殊情况带上等号
int pos = partion(a,left,right);
int len = pos-left+1;
if(len == k)
index = pos;
else if (len < k){
index = topk(a,pos+1,right,k-len);
}else {
index = topk(a,left,pos-1,k);
}
}
return index;
}
};