剑指 Offer 40. 最小的k个数
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
快排模板
注意:先j–。如果这样写
while(i < j && arr[i] <= arr[l]) i++;
while(i < j && arr[j] >= arr[l]) j--;
输入样例为0 1 2 1
时,由于arr[0]<=arr[0]
,所以i++,i=1
;然后arr[3]>=arr[0],j--,j=2
;arr[2]>=arr[0],j--,j=1
;此时i = j = 1
,跳出循环体,但接着swap(arr[l], arr[i])
;于是变成1 0 2 1
这样显然是不对的,因为最小的0被挪到了后面,而1跑到了前面。所以先写j--
避免这种情况?
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int> ans;
quickSort(arr, 0, arr.size() - 1);
cout<<arr[0];
ans.assign(arr.begin(), arr.begin() + k);
return ans;
}
private:
void quickSort(vector<int>& arr, int l, int r){
if(l >= r) return;
int i = l, j = r;
while(i < j){
while(i < j && arr[j] >= arr[l]) j--;
while(i < j && arr[i] <= arr[l]) i++;
swap(arr[i], arr[j]);
}
swap(arr[l], arr[i]);
quickSort(arr, l, i - 1);
quickSort(arr, i + 1, r);
}
};