215. Kth Largest Element in an Array

26 年 3 月 10 日 星期二
420 字
3 分钟

数组中的第K个最大元素

Screenshot 2026-03-10 at 7.53.53 pm

可视化视频

js
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
/**
 * 解题思路:快速选择(QuickSelect)算法
 * 核心思想:基于快速排序的分治思想,不需要完全排序数组,只需找到第k大的元素
 * 时间复杂度:平均O(n),最坏O(n²)(随机选基准可降低最坏情况概率)
 * 空间复杂度:O(n)(递归栈+分区数组)
 */

function findKthLargest(nums, k) {
  /**
   * 快速选择核心函数
   * @param {number[]} nums - 当前要处理的子数组
   * @param {number} k - 要找的第k大元素
   * @returns {number} 找到的目标元素
   */
  const quickSelect = (nums, k) => {
    // 1. 随机选择基准值(pivot),避免有序数组导致的最坏情况
    const pivotIndex = Math.floor(Math.random() * nums.length)
    const pivot = nums[pivotIndex]

    // 2. 分区:将元素分为大于、等于、小于pivot的三组
    const big = [] // 存储大于pivot的元素
    const equal = [] // 存储等于pivot的元素
    const small = [] // 存储小于pivot的元素

    for (const num of nums) {
      if (num > pivot) {
        big.push(num)
      } else if (num < pivot) {
        small.push(num)
      } else {
        equal.push(num)
      }
    }

    // 3. 递归/返回判断
    // 情况1:第k大元素在big数组中,直接递归处理big数组
    if (k <= big.length) {
      return quickSelect(big, k)
    }
    // 情况2:第k大元素在small数组中
    // 计算在small数组中要找的新k值:k - (big.length + equal.length)
    else if (k > big.length + equal.length) {
      return quickSelect(small, k - big.length - equal.length)
    }
    // 情况3:第k大元素在equal数组中,直接返回pivot即可
    else {
      return pivot
    }
  }

  // 调用快速选择函数并返回结果
  return quickSelect(nums, k)
}

文章标题:215. Kth Largest Element in an Array

文章作者:Sirui Chen

文章链接:https://blog.siruichen.me/posts/215_kth_largest_element_in_an_array[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。