class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
quick(arr,0,arr.size()-1);
vector<int> res;
int j=0;
for(int i=0;i<arr.size()&& j<k;i++,j++)
{
res.push_back(arr[i]);
}
return res;
}
void quick(vector<int>& arr,int begin,int end){
if(begin>=end) return;
int id = part(arr,begin,end);
quick(arr,begin,id-1);
quick(arr,id+1,end);
}
int part(vector<int>& arr,int begin,int end){
int pivot=arr[begin];
int i=begin,j=end;
while(i<j)
{
while(arr[j]>pivot && i<j) j--;
if(i<j){arr[i]=arr[j];i++;}
while(arr[i]<pivot && i<j) i++;
if(i<j) {arr[j]=arr[i];j--;}
}
arr[i]=pivot;
return i;
}
};
用排序来做的,主要复习一下快速排序,写一个分区函数part,将数组在begin-end之间的数按照pivot=arr[begin]左右分开,左边的都小于arr[begin],右边的都大于,然后泛化分区下标。quick函数中,是一个递归,上来先分区,然后根据分区id左右各自递归排序,递归终止条件就是begin>=end,这个时候返回即可。