codeTop100题(4)215. 数组中的第K个最大元素

99 阅读1分钟

1. 原题

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

2. 分析

题目要求我们找到数组中第k个最大的数,最简单的方案就是将数组排序,然后找到倒数第k个数,那么我们有如下几个方案

3. 答案

3.1 快排

直接使用java自带的排序类,继续排序

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

3.2 堆排序

我们通过维护一个容量为k的最大堆,堆顶的元素就是我们要的答案

public static int findKthLargest(int[] nums, int k) {
    PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
    for (int num : nums) {
        priorityQueue.add(num);
        if (priorityQueue.size() > k) {
            priorityQueue.poll();
        }
    }
    return priorityQueue.poll();
}

3.3 桶排

因为数据范围是-10000到100000,所以维护一个长度为110001 的桶,每一个数都+10000,保证大于0 ,最后因此放入桶中;然后从最后遍历桶,我们可以找到第k个最大的数,然后-10000就是我们需要的值

public static int findKthLargest(int[] nums, int k) {
    int[] a = new int[110001];
    for (int num : nums) {
        a[num+10000]++;
    }
    for (int i = a.length - 1; i >= 0; i--) {
        k-=a[i];
        if (k <=0) {
            return i-10000;
        }
    }
    return 0;
}

3.4 基于快排的选择算法&&基于堆排的选择算法

这两个是在3.1 3.2的基础上做优化的算法