数组中的第K个最大元素

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

 

解析:注意这道题中说的是k个元素是可以相同的,那么是可以用小顶堆来做的。 

假设小顶堆的大小为k,那么堆顶就为第k个元素

时间复杂度为 新建堆的大小1/2 * k * logk

遍历 (n - k)*logk

总时间复杂度为nlogk的级别

 

class Solution {
    public int findKthLargest(int[] nums, int k) {
        int[] arr = new int[k];
        int len = nums.length;
        for (int i = 0; i < k; i++) {
            arr[i] = nums[i];
        }
        init(arr);
        for (int i = k; i < len; i++) {
            if (nums[i] < arr[0]) {
                continue;
            } else {
                arr[0] = nums[i];
                down(arr, 0);
            }
        }
        return arr[0];
    }

    
    public void init(int[] data)
    {
        int len = data.length;
        for (int i = len/2 - 1; i >= 0; i--) {
            down(data, i);
        }
    }
    
    public void down(int[] data, int root)
    {
        int head = root;
        int headval = data[root];
        int left = head * 2 + 1;
        int right = left + 1;
        int next = left;
        int len = data.length;
        while (left < len) {
            if (right < len && data[right] < data[left]) {
                next = right;
            }
            if (data[next] < headval) {//注意这里,一直是和headval做比较的
                data[head] = data[next];
            } else {
                break;
            }
            head = next;
            left = head * 2 + 1;
            right = left + 1;
            next = left;
        }
        data[head] = headval;
    }
}

 

posted @ 2020-03-05 22:05  萝卜er  阅读(261)  评论(0编辑  收藏  举报