2020年12月25日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
本文目录
题目简介
剑指 Offer 40. 最小的k个数
经典TopK问题,雷同题目: LeetCode 215. 数组中的第K个最大元素(快排、堆排的应用)
1. 基于快排的快速选择(quick select)方法(减治)
快速选择(quick select)方法是快排的变形,通过递归执行partition
操作,找出第k
大元素的索引idx
,然后返回[0,idx]
即为最小的k
个数。
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
// 处理特殊情况
if(k==arr.size() || arr.empty()) return arr;
if(k==0) return {
};
int len = arr.size();
// 设置随机数种子
srand(time(0));
// 寻找第k大的元素索引idx,然后返回[0,idx]即为最小的k个数
return quickSelect(arr,0,len-1,k);
}
// 基于快排的选择方法(quick select)
vector<int> quickSelect(vector<int>& arr, int l, int r, int k){
int rand_idx = rand() % (r-l+1) + l;
swap(arr[l],arr[rand_idx]);
int idx = partition(arr,l,r);
// 返回最小的k个数
if(idx==k) return vector<int>(arr.begin(), arr.begin()+k);
else return idx<k