算法系列-第十三题

72 阅读1分钟

题目名称:数组中的第 K 个最大元素

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

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

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

示例 1:

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

输出: 5

示例 2:

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

输出: 4


/**

* 解法一:快速排序

* 思路:快排,取得升序数组,然后取下标 nums.length - k + 1 对应的值

* 时间复杂度:O(nlogn)

* 空间复杂度:最优 O(logn), 最差 O(n)

*/

function findKthLargest(nums: number[], k: number): number {

if (nums.length === 0) return 0;

return sortArray(nums)[nums.length - k + 1];

}

function sortArray(nums: number[]): number[] {

const len = nums.length;

if (len === 0) return nums;

  


const midIndex = Math.floor(len / 2);

const midValue = nums.splice(midIndex, 1)[0];

  


const left: number[] = [];

const right: number[] = [];

  


// 注意: splice 会修改原数组,所以用 arr.length

for (let i = 0; i < nums.length; i++) {

const n = nums[i];

if (n < midValue) {

left.push(n);

} else {

right.push(n);

}

}

return sortArray(left).concat([midValue], sortArray(right));

}