题目名称:数组中的第 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));
}