215. [✔][M]数组中的第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
提示:
1 <= k <= nums.length <= 105
-104 <= nums[i] <= 104
题解:
// @lc code=start
function findKthLargest(nums: number[], k: number): number {
class Heap {
data: number[];
comparator: (a: number, b: number) => boolean;
constructor(data: number[] = [], comparator: (a: number, b: number) => boolean = (a: number, b: number) => (a > b)) {
this.data = data;
this.comparator = comparator;
this.heapify();
}
get size() {
return this.data.length;
}
heapify() {
for (let i = Math.floor(this.size / 2 - 1); i >= 0; i--) {
this.down(i);
}
}
swap(l: number, r: number) {
[this.data[l], this.data[r]] = [this.data[r], this.data[l]];
}
down(index: number) {
let lastIndex = this.size - 1;
while (true) {
let findIndex = index;
let leftIndex = index * 2 + 1;
let rightIndex = index * 2 + 2;
if (leftIndex <= lastIndex && this.comparator(this.data[leftIndex], this.data[findIndex])) {
findIndex = leftIndex;
}
if (rightIndex <= lastIndex && this.comparator(this.data[rightIndex], this.data[findIndex])) {
findIndex = rightIndex;
}
if (findIndex !== index) {
this.swap(findIndex, index);
index = findIndex;
} else {
break;
}
}
}
up(index: number) {
while (index > 0) {
let parentIndex = (index - 1) >> 1
if (this.comparator(index, parentIndex)) {
this.swap(index, parentIndex);
index = parentIndex;
} else {
break;
}
}
}
push(val: number) {
this.data.push(val);
this.up(this.size - 1);
}
pop() {
if (this.size === 0) {
return null;
}
this.swap(0, this.size - 1);
let curr = this.data.pop();
this.down(0);
return curr;
}
peek() {
return this.data[0];
}
}
let heap = new Heap(nums, (a, b) => a > b);
let res;
for (let i = 0; i < k; i++) {
res = heap.pop();
}
return res;
};
// @lc code=end