每天一道算法题之数组中第K大的元素

数组中第K大的元素

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

  • 解析:采用优先队列进行解决,java中可以直接调用优先队列,但是面试官可能希望你用大顶锥进行求解.
  • 代码部分:
public int findKthLargestTwo(int[] nums, int k) {
    int heapSize = nums.length;
    //构建大顶锥
    buildMaxHeap(nums, heapSize);
    //移除最大元素,并调整大顶锥
    //通过交换,并减少堆的结点数,进行移除
    for (int i = nums.length - 1; i >= nums.length - k + 1; i--) {
        swap(nums, 0, i);
        --heapSize;
        maxHeapify(nums, 0, heapSize);
    }
    return nums[0];
}

//建堆
//遍历所有的根结点,从最底层开始调整
public void buildMaxHeap(int[] a, int heapSize) {
    for (int i = heapSize / 2 - 1; i >= 0; i --) {
    //建堆时从最后一层节点进行调整,当调整到根结点时,大顶锥已建立,
        maxHeapify(a, i, heapSize);
    } 
}
//调整
//i是父节点,heapSize是堆的节点个数,a存储节点值的数组
//对索引i位置处的节点进行堆调整
public void maxHeapify(int[] a, int i, int heapSize) {
    //思路:
    //	找到较大节点值
    //  将其与父节点进行交换
    //  将交换后的点作为父节点进行调整
    int l = i * 2 + 1;
    int r = i * 2 + 2;
    int 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, largest);
        //交换之后i位置出的值变为最大值,需要对largest处进行堆调整
        maxHeapify(a, largest, heapSize);
    }
}
//交换
public void swap(int[] a, int i, int j) {
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

  1. https://leetcode-cn.com/problems/kth-largest-element-in-an-array/ ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值