1. 原题
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的基础上做优化的算法