力扣215-数组中的第K个最大元素

参考网址
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/solution/shu-zu-zhong-de-di-kge-zui-da-yuan-su-by-leetcode-/

构建大根堆,这是一个知识点,如何进行堆排序

    void maxHeapify(vector<int>& a, int i, int heapSize) {
        int l = i * 2 + 1, r = i * 2 + 2, largest = i;
        if (l < heapSize && a[l] > a[largest]) {
            largest = l;
        } 
        if (r < heapSize && a[r] > a[largest]) {
            largest = r;
        }
        if (largest != i) {
            swap(a[i], a[largest]);
            maxHeapify(a, largest, heapSize);
        }
    }

```cpp
   void buildMaxHeap(vector<int>& a, int heapSize) {
        for (int i = heapSize / 2; i >= 0; --i) {
            maxHeapify(a, i, heapSize);
        } 
    }

删除堆顶元素后的堆调整,把堆中最小的值与堆顶互换,然后只需要排列的堆数量减1,因为互换之后堆顶元素放在了最后,如果再与其比较,等于又做了一次堆排,不是我们想要的,只要把堆顶放在最后(打入地牢)不用管它就是,所以heapSize减1。
[提个问题]:如果把堆底的元素赋值给堆顶,要不要heapSize减1呢?
注意:一定要heapSize减1,因为堆排后左右子节点的大小不固定,有可能左大于右,也有可能右大于左,swap后有可能堆底的元素比堆顶的要大,这时如果heapSize不减1,进行堆排结果就是有问题的,所以把堆顶打入地牢为好,不要去跟他比较。

       for (int i = nums.size() - 1; i >= nums.size() - k + 1; --i) {
            swap(nums[0], nums[i]);
            --heapSize;
            maxHeapify(nums, 0, heapSize);
        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可峰科技

生活不易

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值