215. 数组中的第K个最大元素

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个最大元素题解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值