class Solution {
public:
vector<int> smallestK(vector<int>& arr, int k) {
if(k==0)return{};
quickSort(arr, 0, arr.size() - 1,k);
vector<int> vec;
for (int i = 0; i < k; ++i) {
vec.push_back(arr[i]);
}
// sort(vec.begin(),vec.end());
return vec;
}
void quickSort(vector<int>& arr,int left,int right,int k)
{
if(left<right)
{
int loc = partition(arr, left, right);
//注意这里,loc是数组中元素的下标。在loc之前的元素都是比loc指向的元素小,
//后面的都是比他大。如果k==loc,正好loc之前的k个元素是我们要找的,也就是
//数组中最小的k个,如果k>loc,说明前k个元素不够,我们还要往后再找找。如果
//k<loc,说明前k个足够了,我们只需要在loc之前找k个即可。
if (loc > k) {
quickSort(arr, left, loc - 1,k);
} else if (loc < k) {
quickSort(arr, loc + 1, right,k);
}
}
}
int partition(vector<int>& arr,int left,int right)
{
int key=arr[left];
while(left<right)
{
while(left<right&&arr[right]>=key)right--;
arr[left]=arr[right];
while(left<right&&arr[left]<=key)left++;
arr[right]=arr[left];
}
arr[left]=key;
return left;
}
};
力扣17.14. 最小K个数——快速排序
最新推荐文章于 2024-04-29 08:57:16 发布