Problem: 215. 数组中的第K个最大元素
思路
你选用何种方法解题? 快排
解题过程
这些方法具体怎么运用? 基于快速排序的分区思想,但每次只递归处理包含目标元素的那一半,从而将平均时间复杂度从O(nlogn)降低到O(n)。
复杂度
- 时间复杂度: O(∗)O(∗)
- 空间复杂度: O(∗)O(∗)
Code
function findKthLargest(nums: number[], k: number): number {
// 构建小顶堆
function buildHeap(arr: number[], len: number) {
const lastNode = len - 1;
const parent = Math.floor((lastNode - 1) / 2);
for (let i = parent; i >= 0; i--) {
heapify(arr, len, i);
}
}
function heapify(arr: number[], len: number, idx: number) {
if (idx >= len) return;
const c1 = 2 * idx + 1, c2 = 2 * idx + 2;
let min = idx;
if (c1 < len && arr[c1] < arr[min]) {
min = c1;
}
if (c2 < len && arr[c2] < arr[min]) {
min = c2;
}
if (min !== idx) {
[arr[idx], arr[min]] = [arr[min], arr[idx]];
heapify(arr, len, min);
}
}
const tree = nums.slice(0, k);
buildHeap(tree, tree.length);
for (let i = k; i < nums.length; i++) {
if(tree[0] < nums[i]) {
tree[0] = nums[i];
heapify(tree, k, 0);
}
}
return tree[0];
};