215. 数组中的第K个最大元素---最小堆实现s

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
思路:

其实这个题使用快速排序肯定是可以的,但是因为堆排序在面试中是重点,所以我这一次就重点学习了一下堆排序。
堆排序的的重要思想就是:
形成的时候上移
插入的时候下推
这个题目使用最小堆,巧妙之处就在于,先形成一个k容量的最小堆,然后将k-length-1的数进行比较,如果大于堆顶就假如到堆中。
这样保证了什么呢?当然是到遍历完成后堆顶就是第k大啦,为啥呢,最小堆下面的可都比堆顶大啊,懂了嘛?嘿嘿(●ˇ∀ˇ●)

class Solution {
//    最小堆实现k大
    public int findKthLargest(int[] nums, int k) {
        //构建最小堆
        for(int i=k/2-1;i>=0;i--){
            //先将这k个数 ,形成一个最小堆
            heapify(nums,i,k);
        }
        //遍历剩下的数
        for(int i=k;i<nums.length;i++){
            if(nums[0]>nums[i])
                continue;
            //先把i给0
            swap(nums,0,i);
            heapify(nums,0,k);
        }
        return nums[0];
    }
    public void heapify(int[] heap,int index,int k){
        int temp=index;
        //下推重点之处了
        while(true){
        //先判断左
            if(index*2+1<k&&heap[temp]>heap[index*2+1]){
                temp=index*2+1;
            }
            //在判断右
            if(index*2+2<k&&heap[index*2+2]<heap[temp]) {
                temp = index * 2 + 2;
            }
            //没有交换过 ,代表顶点就是最小的,不用管了,直接退出break
            if(index==temp)
                break;
            swap(heap,index,temp);
            index=temp;
        }
    }
    public void swap(int []heap,int a,int b){
        int temp=heap[a];
        heap[a]=heap[b];
        heap[b]=temp;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值