题解 | #寻找第K大#

寻找第K大

http://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf

import java.util.*;

public class Solution { public int findKth(int[] a, int n, int K) { return quickSort(a, 0, a.length - 1, K); }

private int quickSort(int[] arr, int left, int right, int k){
    int p = partition(arr, left, right);
    // 改进后,很特殊的是,p是全局下标,只要p对上topK坐标就可以返回
    if (p == arr.length - k) {
        return arr[p];
    }else if (p < arr.length - k) {
        // 如果基准在左边,这在右边找
        return quickSort(arr, p + 1, right,k);
    }else {
        return quickSort(arr, left, p - 1,k);
    }
}

private int partition(int[] arr, int left, int right) {
    // 可优化成随机,或中位数
    int key = arr[left];
    while (left < right) {
        while (left < right && arr[right] >= key) right--;
        arr[left] = arr[right];
        while (left < right && arr[left] <= key) left++;
        arr[right] = arr[left];
    }
    arr[left] = key;
    return left;
}

}

我居南半坡 文章被收录于专栏

多刷题,积蓄力量,欢迎讨论

全部评论

相关推荐

喜欢飞来飞去的雪碧在刷代码:可以试一试字节
点赞 评论 收藏
分享
06-08 22:25
门头沟学院 Java
从零开始的转码生活:这hr不会打开手机不分青红皂白给所有人群发这句话,过一会再给所有人再发一遍,这肯定会有重复的,不管,再过一会再发一遍
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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