215. 数组中的第K个最大元素
给定整数数组 nums
和整数 k
,请返回数组中第 k
个最大的元素。
请注意,你需要找的是数组排序后的第 k
个最大的元素,而不是第 k
个不同的元素。
你必须设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 1:
输入: [3,2,1,5,6,4], k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4
class Solution {
/**
两种方式:
1.快速排序+类似二分搜索:因为不需要保证数组全有序,只需要找到目标K大元素,所以可以通过partion位置和K的比较结合。例如:(1)partion=k,则找到目标
(2)partion<k,说明目标在右边,从右边找并随机一个partion应用递归
其他同理。
2.小顶堆:维护K个最大元素的小顶堆,堆顶就是目标K(采用该方法实现)
*/
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> heap = new PriorityQueue<>(k,(c1,c2) -> c1-c2);
//先添加k个元素
for(int i=0;i<k;i++){
heap.offer(nums[i]);
}
//后续元素:
//1.如果当前元素大于堆顶元素,则删除堆顶并入堆;
//2.如果小于,则抛弃。
for(int i=k;i<nums.length;i++){
int top = heap.peek();
int curVal = nums[i];
if(curVal>top){
heap.poll();
heap.offer(curVal);
}
}
return heap.peek();
}
}