LeetCode 「中等」215.数组中的第K个最大元素

sankigan2025-2-21算法LeetCode

数组中的第K个最大元素open in new window

题目描述

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

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

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

示例

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

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

解答

无脑调用 sort 方法

Code
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
  return nums.sort((a, b) => b - a)[k - 1];
};

快速选择

  1. 选择一个元素作为“基准”(pivot)
  2. 将数组分为两部分:一部分包含大于基准的元素,另一部分包含小于基准的元素
  3. 根据 k 的值,决定在哪个部分中继续查找第 k 个最大的元素
  4. 递归地在选定的部分中重复上述步骤,直到找到第 k 个最大的元素
Code
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
  var partition = function (nums, left, right) {
    const pivot = nums[right];
    let i = left;

    for (let j = left; j < right; ++j) {
      if (nums[j] > pivot) {
        [nums[i], nums[j]] = [nums[j], nums[i]];
        ++i;
      }
    }

    [nums[i], nums[right]] = [nums[right], nums[i]];
    return i;
  };

  var quickSelect = function(nums, left, right, k) {
    if (left === right) return nums[left];
    const pivotIndex = partition(nums, left, right);

    if (pivotIndex === k) {
      return nums[k];
    } else if (pivotIndex > k) {
      return quickSelect(nums, left, pivotIndex - 1, k);
    } else {
      return quickSelect(nums, pivotIndex + 1, right, k);
    }
  };

  return quickSelect(nums, 0, nums.length - 1, k - 1);
};
更新于 2025/3/20 23:23:29