剑指 Offer 40. 最小的k个数
剑指 Offer 40. 最小的k个数
思路
快排思想+位置判断
在快排中判断:如果快排的分割点的索引恰好是k-1,那么停止递归直接输出前k个数
代码
class Solution {
public:
int k1;
void quick_sort(vector<int>& arr,int l,int r)
{
if(l<r)
{
int i=l;
int j=r;
int x=arr[l];
while(i<j)
{
while(i<j&&arr[j]>=x)
{
j--;
}
if(i<j)
{
arr[i]=arr[j];
i++;
}
while(i<j&&arr[i]<x)
{
i++;
}
if(i<j)
{
arr[j]=arr[i];
j--;
}
}
arr[i]=x;
if(i!=k1-1)
{
quick_sort(arr,l,i-1);
quick_sort(arr,i+1,r);
}
}
}
vector<int> getLeastNumbers(vector<int>& arr, int k) {
k1=k;
quick_sort(arr,0,arr.size()-1);
vector<int> res(arr.begin(),arr.begin()+k);
return res;
}
};