美文网首页
215. 数组中的第K个最大元素

215. 数组中的第K个最大元素

作者: justonemoretry | 来源:发表于2021-09-01 22:23 被阅读0次
image.png

解法

class Solution {
    
    public int findKthLargest(int[] nums, int k) {
        buildHeap(nums);
        int len = nums.length;
        int temp = nums[0];
        for (int i = 0; i < k; i++) {
            int curLen = len - i;
            // 交换首个元素到末尾
            temp = nums[0];
            nums[0] = nums[curLen - 1];
            nums[curLen - 1] = temp;
            // 对首个元素进行调整,但不会再调整最后的元素
            adjustHeap(nums, 0, curLen - 1);
        }
        return temp;
    }

    /**
     * 构造大顶堆
     * @param nums
     */
    private void buildHeap(int[] nums) {
        int length = nums.length;
        // 从最后一个非叶节点开始调整,向下调整,一直调整到根节点
        for (int i = length / 2 - 1; i >= 0; i--) {
            adjustHeap(nums, i, length);
        }
    }

    /**
     * 调整大顶堆,向下调整
     * @param nums 数组
     * @param i 要调整的节点
     * @param length 调整到的末尾位置
     */
    private void adjustHeap(int[] nums, int i, int length) {
        int temp = nums[i];
        for (int k = 2 * i + 1; k < length; k = 2 * k + 1) {
            // 找出两个子节点中较大的值
            if (k + 1 < length) {
                if (nums[k + 1] > nums[k]) {
                    k = k + 1;
                }
            }
            if (nums[k] > temp) {
                nums[i] = nums[k];
                i = k;
            } else {
                break;
            }
        }
        nums[i] = temp;
    }
}

相关文章

网友评论

      本文标题:215. 数组中的第K个最大元素

      本文链接:https://www.haomeiwen.com/subject/cjrailtx.html