

//解法1:排序
vector<int> smallestK(vector<int>& arr, int k)
{
sort(arr.begin(),arr.end());
return {arr.begin(),arr.begin()+k};
}
//解法2:大根堆
vector<int> smallestK(vector<int>& arr, int k)
{
if(k == 0 || arr.empty()) return {};
priority_queue<int> pq;
for(auto e : arr)
{
pq.push(e);
if(pq.size()>k) pq.pop();
}
vector<int> ret;
while(k--)
{
ret.push_back(pq.top());
pq.pop();
}
return ret;
}
//解法3:快排
vector<int> smallestK(vector<int>& arr, int k)
{
srand(time(NULL));
if(k==0 || arr.empty()) return {};
qsort(arr,k,0,arr.size()-1);
return {arr.begin(),arr.begin()+k};
}
void qsort(vector<int>& arr,int k,int l,int r)
{
if(l>=r) return;
int key = getRandom(arr,l,r);//随机选择基准元素
int left = l-1,right = r+1,i = l;//数组分三块
while(i<right)
{
if(arr[i]<key) swap(arr[++left],arr[i++]);
else if(arr[i] == key) i++;
else swap(arr[i],arr[--right]);
}
int a = left - l +1,b = right - left - 1;//分情况讨论
if(a>k) qsort(arr,k,l,left);
else if(a+b>=k) return;
else qsort(arr,k-a-b,right,r);
}
int getRandom(vector<int>& arr,int left,int right)
{
return arr[rand() % (right-left+1) + left];
}