要求:
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5 [1,2,3,4,5,6]
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4 [1,2,2,3,3,4,5,5,6]
思路:
- 设置一个长度为K的优先队列,按从小到大排序,栈顶元素为队列中最小值。
- 对于数组的前K个元素,直接入队列。
- 以后每入一个新元素,都与顶部元素比较,但是仅是获取顶部元素与之比较,如果新元素比顶部元素大,就弹出顶部元素,新元素入队列,自动排序。
- 最后全部入队后,直接弹出队首元素即可。
代码:
class Sloution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> queue = new PriorityQueue<>(k, new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
for (int i = 0; i < k; i++) {
queue.add(nums[i]);
}
for (int i = k; i < nums.length; i++) {
Integer temp = queue.peek();
if (nums[i] > temp) {
queue.poll();
queue.add(nums[i]);
}
}
return queue.poll();
}
}