在未排序的数组中找到第 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 说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
1.直接建立大根堆,然后从大根堆中拿第k个即可
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(nums.length, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
for (int i = 0; i < nums.length; i++) {
priorityQueue.offer(nums[i]);
}
for (int i = 0; i < k - 1; i++) {
priorityQueue.poll();
}
return priorityQueue.poll();
}
2、建立大小为k的小根堆,遍历元素,当堆顶元素小于当前元素,则用当前元素替换堆顶元素
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(k, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
for (int i = 0; i < nums.length; i++) {
if(priorityQueue.size() < k){
priorityQueue.offer(nums[i]);
}else{
if(nums[i] > priorityQueue.peek() ){
priorityQueue.poll();
priorityQueue.offer(nums[i]);
}
}
}
// for (int i = 0; i < k - 1; i++) {
// priorityQueue.poll();
// }
return priorityQueue.poll();
}