题解 | #寻找第K大#
寻找第K大
https://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf
W
获取第K大在排序后数组位置
快排
获取随机分区间点
循环当l<r
如果就是K,直接返回值
判断在分区点左右
左
r=p-1;
右
l=p+1
N
左闭右闭区间划分
没有找到return -1;
class Solution {
public:
int fn;
int quickfindK(vector<int>& nums,int l,int r){
while(l<=r){
int p=partition(nums, l,r);
if(p<fn){
l=p+1;//第k大元素在nums[p+1 r]里
}
else if(p>fn){
r=p-1;
}
else if(p==fn){
return nums[p];//找到第k最大元素
}
}
return -1;//没有找到或区间不符合
}
int partition(vector<int>& nums ,int l,int r){
srand(time(nullptr));
int x=rand()%(r-l+1)+l;
swap(nums[r],nums[x]);
int pivot=nums[r];
int i=l,j=l;
for(;j<r;j++){
if(nums[j]<pivot){
swap(nums[i],nums[j]);
i++;
}
}
swap(nums[i],nums[r]);
return i;
}
int findKth(vector<int>& nums, int n,int k) {
fn=nums.size()-k;//note 处理
if(n==1){
return nums[0];
}
return quickfindK(nums,0,nums.size()-1);
}
};
查看7道真题和解析
