Skip to content
On this page

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

原题链接:LeetCode 215. 数组中的第K个最大元素

题目描述

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

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

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

[3,2,1,5,6,4],

示例 2:

[3,2,3,1,2,4,5,5,6], 

**提示: **

1 <= k <= nums.length <= 105
-104 <= nums[i] <= 104

难度: Medium


题解代码

javascript
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */

function findKthLargest (arr, k) {
    const len = arr.length
    for (let i = Math.floor(len / 2); i >= 0; i--) {
        // 构建最大堆
        maxHeapify(arr, i, len)
    }
    // 执行k-1次下沉
    for (let j = 0; j < k - 1; j++) {
        swap(arr, 0, len - 1 - j)
        maxHeapify(arr, 0, len - 1 - j)
    }
    // 剩下的最大堆顶部为第k大的值
    return arr[0]
}
  
function maxHeapify (arr, i, size) {
    let l = i * 2 + 1
    let r = i * 2 + 2
    let largest = i
    if (l < size && arr[l] > arr[largest]) {
        largest = l
    }
    if (r < size && arr[r] > arr[largest]) {
        largest = r
    }
    if (largest !== i) {
        swap(arr, i, largest)
        maxHeapify(arr, largest, size)
    }
  }

function swap (arr, i, j) {
    [arr[i], arr[j]] = [arr[j], arr[i]]
}

技术文档集合