在未排序的数组中找到第 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
具体代码实现如下:
import java.util.*;
class Solution {
public int findKthLargest(int[] nums, int k) {
// 利用优先队列的小顶堆,先给小顶堆中添加k个元素,然后进行判断,大于堆顶的元素进堆,小于堆顶的元素不要。
// 或者先将元素全部加入小顶堆中,然后poll出 length - k个元素,剩下的堆顶元素就是所求的第k个最大的元素。
// 或者先将k个元素加入到小顶堆中,然后再offer一个进来,再poll一个出去
PriorityQueue<Integer> min = new PriorityQueue<>();// 声明创建小顶堆
int l = nums.length;
for(int i = 0; i < k; i++){
min.offer(nums[i]);// 先往小顶堆中添加k个元素
}
for(int i = k; i < l; i++){
min.add(nums[i]);// 往小顶堆中再添加一个元素,利用小顶堆自动排出最小元素放堆顶的性质
min.poll();// 再将小顶堆的堆顶元素(堆中最小的元素)poll出,保证堆中只有k个元素。
}
return min.peek();
/*
PriorityQueue<Integer> min = new PriorityQueue<>();// 声明创建一个小顶堆
for(int i = 0; i < nums.length; i++){
min.offer(nums[i]);// 将数组元素加入到小顶堆中
}
for(int i = 0; i < nums.length; i++){
if(min.size() > k){
min.poll();
}
}
return min.peek();
*/
/*暴力法:先对数组进行升序排列,然后返回第[length - k]个元素
Arrays.sort(nums);
int n = nums.length;
return nums[n-k];
*/
}
}
人生若只如初见,何事秋风悲画扇。
等闲变却故人心,却道故人心易变。
-----------纳兰性德
小白寄语:学如逆水行舟,不进则退。