题解 | #寻找第K大#

寻找第K大

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

堆排序是最快的,而且堆排不用全排序完,题目要第几个就排几次就可以直接终止了;

import java.util.*;

public class Solution {
    public int findKth(int[] a, int n, int K) {
        // write code here
        for (int i = a.length / 2 - 1; i >= 0; i--) {
            // 建堆
            buildHeap(a, i, a.length);
        }

        // 这里不是按照a.length逐次-1,是按照k的大小,即每次将大顶堆根节点换到数组末尾的时候,我就们找到第i个最大值了,i=k时就是结果;
        for (int i = 0; i < K; i++) {
            swap(a, 0, a.length - 1 - i);
            buildHeap(a, 0, a.length - 1 - i);
        }
        return  a[a.length - K];
    }

    private void buildHeap(int[] arr, int i, int len) {
        int tmp = arr[i];
        for(int j = 2 * i + 1 ; j < len; j = j * 2 + 1) {
            if (j + 1 < len && arr[j] < arr[j + 1]) {
                j++;
            }
            if (tmp < arr[j]) {
                arr[i] = arr[j];
                i = j;
            }
        }
        arr[i] = tmp;
    }

    private void swap (int[] arr, int idx1, int idx2) {
        int tmp = arr[idx1];
        arr[idx1] = arr[idx2];
        arr[idx2] = tmp;
    }
}
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务