一、题目介绍
原题:面试题 17.14. 最小 K 个数
设计一个算法,找出数组中最小的 k 个数。以任意顺序返回这 k 个数均可。
二.解法
和昨天那道很相似,也是要三路划分,和随机选数

区别
这次是找最k小

最后在返回数组的时候直接用数组的begin,到begin+k即可
cpp
class Solution {
public:
vector<int> smallestK(vector<int>& nums, int k) {
if(k == 0) return {};
srand(time(NULL));
qsort(nums,0,nums.size()-1,k);
return {nums.begin(),nums.begin()+k};
}
int qsort(vector<int>& nums,int l,int r,int k)
{
//随机选择一个key
int n=nums.size();
if(l>=r) return nums[l];
int key=getrandom(nums,l,r);
//对数组按照key来进行排序
int i=l,left=l-1,right=r+1;
while(i<right)
{
if(nums[i]<key)
swap(nums[i++],nums[++left]);
else if(nums[i]>key)
swap(nums[i],nums[--right]);
else
i++;
}
//判断k的位置区间
int b=right-1-left+1-1,a=left-l+1;
if(a>=k)
return qsort(nums,l,left,k);
else if(a+b>=k)
return key;
else
return qsort(nums,right,r,k-b-a);
}
int getrandom(vector<int>& n,int l,int r)
{
int x = rand();
return n[x % (r-l+1) + l];
}
};