在未排序的数组中找到第 k 个最大的元素
程序员文章站
2024-03-15 22:17:24
...
:在未排序的数组中找到第 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
//方法一:使用Arrays工具类
public static int findKthLargest1(int nums[], int k) {
//1.排序
Arrays.sort(nums);
//2.返回第k个最大的元素
return nums[nums.length - k];
}
//方法二:计数排序
public static int findKthLargest2(int nums[], int k) {
if (nums == null || nums.length == 0) {
return -1;
}
//1.找到最大最小值
int max = nums[0];
int min = nums[0];
for (int i = 1; i < nums.length; i++) {
max = max > nums[i] ? max : nums[i];
min = min < nums[i] ? min : nums[i];
}
//2.创建没有重复元素的数组
int[] output = new int[max - min + 1];
//计算重复个数
for (int i = 0; i < nums.length; i++) {
output[nums[i] - min]++;
}
//3.计数
int count = 0;
for (int i = output.length - 1; i >= 0; i--) {
count += output[i];
if (count >= k) {
return i + min;
}
}
return -1;
}
//3.优先队列
public static int findKthLargest3(int nums[], int k) {
PriorityQueue<Integer> heap = new PriorityQueue<>();
for (int num : nums){
if (heap.size()<k){
heap.add(num);
}else if (heap.peek() < num){
heap.poll();
heap.add(num);
}
}
return heap.poll();
}
上一篇: Unity武器与子弹碰撞检测