LeetCode刷题日记:215. 数组中的第K个最大元素

数组中的第K个最大元素
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
 

提示:
1 <= k <= nums.length <= 104
-104 <= nums[i] <= 104

方法1:

class Solution {
    public int findKthLargest(int[] nums, int k) {
        Arrays.sort(nums);
        return nums[nums.length-k];
    }
}

方法2:

class Solution {
   public int findKthLargest(int[] nums, int k) {
        nums = heapSort(nums);
        return nums[k-1];
    }

    public void swap(int[] array, int i, int j){
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

   // 堆排序
    public int[] heapSort(int[] array){
       int len = array.length;
        for (int i = len/2-1; i >= 0 ; i--) {
            adjustHeap(array, i, len);
        }
        for (int i = len - 1; i >= 0 ; i--) {
            swap(array, i, 0);
            adjustHeap(array, 0, i);
        }
        return array;
    }

    // 调整堆元素
    public void adjustHeap(int[] array, int i, int length){
       //先取出当前元素i
        int temp = array[i];
        //从i结点的左子结点开始,也就是2i+1处开始
        for(int k=i*2+1;k<length;k=k*2+1){
            //如果左子结点小于右子结点,k指向右子结点(k = i*2+1为左节点,k = i*2+1+1为右节点)
            if(k+1<length && array[k]>array[k+1]){
                k++;
            }
            //如果子节点大于父节点,将子节点值赋给父节点(不用进行交换,后续归位)
            if(array[k] < temp){
                array[i] = array[k];
                i = k;
            }else{
                break;
            }
        }
        //将temp值放到最终的位置
        array[i] = temp;
    }     
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值