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

    }
};
全部评论

相关推荐

书海为家:实习是成为大厂正式员工很好的敲门砖,看您的简历中有一段实习经历,挺好的。我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己实习时做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
点赞 评论 收藏
分享
02-25 19:38
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务