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

22 阅读1分钟

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

思路

你选用何种方法解题? 快排

解题过程

这些方法具体怎么运用? 基于快速排序的分区思想,但每次只递归处理包含目标元素的那一半,从而将平均时间复杂度从O(nlogn)降低到O(n)。

复杂度

  • 时间复杂度: O(∗)O(∗)
  • 空间复杂度: O(∗)O(∗)

Code

function findKthLargest(nums: number[], k: number): number {
    // 构建小顶堆
    function buildHeap(arr: number[], len: number) {
        const lastNode = len - 1;
        const parent = Math.floor((lastNode - 1) / 2);
        for (let i = parent; i >= 0; i--) {
            heapify(arr, len, i);
        }
    }
    function heapify(arr: number[], len: number, idx: number) {
        if (idx >= len) return;
        const c1 = 2 * idx + 1, c2 = 2 * idx + 2;
        let min = idx;
        if (c1 < len && arr[c1] < arr[min]) {
            min = c1;
        }
        if (c2 < len && arr[c2] < arr[min]) {
            min = c2;
        }
        if (min !== idx) {
            [arr[idx], arr[min]] = [arr[min], arr[idx]];
            heapify(arr, len, min);
        }
    }

    const tree = nums.slice(0, k);
    buildHeap(tree, tree.length);
    for (let i = k; i < nums.length; i++) {
        if(tree[0] < nums[i]) {
            tree[0] = nums[i];
            heapify(tree, k, 0);
        }
    }
    return tree[0];
};