最小的k个数
题目描述
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
想法
复习一下快排,快排的核心就是先找一个基准数(一般为第一个),然后将所有比基准数小的数字放到自己左边,大的放右边。然后递归操作左边和右边。
具体的操作是设置两个指针分别指向头和尾,然后不断缩小左右边界,如果出现大的数字在左边就放到右边,反之亦然。详见代码。
代码
class Solution {
public:
void quick_sort(vector<int>&a, int l, int r) {
if (l>=r) return;
int i=l, j=r, x=a[l];
while (i<j) {
while (i<j && a[j]>=x) j--;
if (i<j) a[i++]=a[j];
while (i<j && a[i]<x) i++;
if (i<j) a[j--]=a[i];
}
a[i]=x;
quick_sort(a, l, i-1);
quick_sort(a, i+1, r);
}
vector<int> getLeastNumbers(vector<int>& arr, int k) {
quick_sort(arr, 0, arr.size()-1);
// sort(arr.begin(), arr.end());
return vector<int>( arr.begin(), arr.begin()+k );
}
};