您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        指定n个数字,找出其中最大的k个数,这就是经典的TopK问题
public int[] topK(int[] array, int k) {
    Arrays.sort(array);
    return Arrays.copyOfRange(array, array.length - k, array.length);
}public int[] topK(int[] array, int k) {
    for(int i = 0; i < k; i++) {
        for(int j = array.length - 1; j > 0; j--) {
            if(array[j] > array[j - 1]) {
                int tmp = array[j];
                array[j] = array[j - 1];
                array[j - 1] = tmp;
            }
        }
    }
}public Integer[] topK(int[] array, int k) {
    PriorityQueue<Integer> queue = new PriorityQueue<>();
    for(int i = 0; i < k; i++) {
        queue.add(array[i]);
    }
    for(int i = k; i < array.length; i++) {
        if(array[i] > queue.peek()) {
            queue.poll();
            queue.add(array[i]);
        }
    }
    return (Integer[])queue.toArray();
}代码:
public int[] topK5(int[] array, int k) {
    int left = 0;
    int right = array.length - 1;
    //因为数组下标是以0开始的,因此第k个的小标为k - 1,因此传入的为k - 1
    int flag = RS(array, left, right, k - 1);
    //返回值flag为第k个最大值的下标,因此需要前k个最大的值时,拷贝数组的范围是[0, flag + 1)
    return Arrays.copyOfRange(array, 0, flag + 1));
}
private int RS(int[] array, int left, int right, int k) {
    if (left >= right) {
        return left;
    }
    int index = partition(array, left, right);
    int temp = index - left;
    if(temp >= k) {
        return RS(array, left, index - 1, k);
    } else {
        return RS(array, index + 1, right, k - index);
    }
}
private int partition(int[] array, int left, int right) {
    int tmp = array[left];
    int l = left;
    int r = right;
    while(l < r) {
        while(l < r && array[r] <= tmp) {
            r--;
        }
        array[l] = array[r];
        while(l < r && array[l] >= tmp) {
            l++;
        }
        array[r] = array[l];
    }
    array[l] = tmp;
    return l;
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。