215. 数组中的第K个最大元素
题目
215. 数组中的第K个最大元素题目
变式题:找出n个元素的无序数组中的中位数,此时k为n / 2
方法思路
堆(手写)
- 先将
前k个数
建立一个k个大小的小根堆
- 然后从
k
位置依次遍历,将堆顶的数替换为较大的数加入到堆中,维持k个元素的小根堆
- 当遍历完后,
堆顶元素
就为数组中第k个最大的数 - 因为此时堆中保存着整个数组最大的k个数,又是小根堆,所以堆顶即为所求
代码
class Solution {
public:
// 交换数
void swap(vector<int>& nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
// 将堆i位置上的数往下沉,heapsize表示堆得大小
void heapify(vector<int>& nums, int i, int heapsize) {
// 记录i的左孩子位置
int left = i * 2 + 1;
// 左孩子位置没超过边界
while (left < heapsize) {
// 左孩子和右孩子取较小者
int litter = left + 1 < heapsize && nums[left + 1] < nums[left] ? left + 1 : left;
// 如果i不大于它的两个孩子,说明已经找到了自己的位置,break
if (nums[i] <= nums[litter]) break;
// 否则,交换
swap(nums, i, litter);
// i来到下一层,继续判断是否交换
i = litter;
left = i * 2 + 1;
}
}
int findKthLargest(vector<int> nums, int k) {
// 将前k个数建立成小根堆
for (int i = k - 1; i >= 0; i--) {
heapify(nums, i, k);
}
// 遍历后面的数,找到比堆顶大的数进行heapify,维持k个元素的小根堆
for (int i = k; i < nums.size(); i++) {
if (nums[i] <= nums[0]) continue;
nums[0] = nums[i];
heapify(nums, 0, k);
}
// 返回堆顶元素
return nums[0];
}
};
官方题解:215. 数组中的第K个最大元素题解