lc刷题记录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
k选择
1. 三路k选择
int quickSort(vector<int>& nums, int k)
- 从
nums
中随机选择一个base数,划分成大于、等于、小于base的三部分 - 第k大的数满足:找到一个
base
, 使得k不在large中k > large.size()
、k不在small中k < large.size() + small.size()
- 递归:如果k在large中(
k <= large.size()
)、k在small中(k > large.size() + equal.size()
),相应递归;否则,直接返回base。
递归条件的判定容易弄错
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
return quickSort(nums, k);
}
//三路划分k选择
int quickSort(vector<int>& nums, int k){
vector<int> small, equal, large;
int base = nums[rand() % nums.size()];
for(auto x: nums){
if(x > base){
large.push_back(x);
}
else if(x < base){
small.push_back(x);
}
else{
equal.push_back(x);
}
}
if(k <= large.size()){
return quickSort(large, k);
}
else if(large.size() + equal.size() < k){
return quickSort(small, k - large.size() - equal.size());
}
else{
return base;
}
}
};
复杂度分析: