题解 | #寻找第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);

    }
};
全部评论

相关推荐

11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务