题解 | #寻找第K大#

寻找第K大

https://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf?tpId=190&&tqId=35209&rp=1&ru=/activity/oj&qru=/ta/job-code-high-rd/question-ranking

我骄傲了,第一次写题解
图片说明
总的思想就是,每一次快排后参考值的位置对于完全有序的数组来说就已经确定了,判断参考值位置在目标位置的左边还是右边或者相等。
如果参考值位置在目标位置的左边,说明参考值小于目标值,则需要对参考值右部分进行快排重新获取位置
如果参考值位置在目标位置的右边,说明参考值大于目标值,则需要对参考值左部分进行快排重新获取位置
相等则返回

public class Solution {
    //一次快排后参考值位置就已经确定了,判断这个位置是否等于给定值
    //如果小于则对右边部分快排,大于则对左边部分快排
    public int findKth(int[] a, int n, int K) {
        // write code here
        if(a==null||a.length==0){
            return 0;
        }
        int left = 0;
        int right = n-1;
        //转换一下,第k大的元素索引为n-k
        int target = n-K;
        while(true){
            int index = getIndex(a,left,right);
            if(index == target){
                return a[index];
            }else if(index<target){
                left = index+1;//对右边进行快排
            }else{
                right = index-1;//对左边进行快排
            }
        }
    }
    //快排获取参考值位置
    public int getIndex(int[] arr,int left,int right){
        int i = left,j = right;
        int base = arr[left];//参考值
        while(i<j){
            //从右边开始找,找到第一个小于参考值的数
            while(arr[j]>=base&&i<j){
                j--;
            }
            //从左边开始找,找到第一个大于参考值的数
            while(arr[i]<=base&&i<j){
                i++;
            }
            //找到后交换这两个数
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        arr[left] = arr[j];
        arr[j] = base;//参考值的位置就在j处
        return j;
    }
}
全部评论

相关推荐

安静的垂耳兔在泡澡:ks已经第八次投递了,它起码挂了还让你再投,不错了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务