题目链接
数组中的第K个最大元素
题目描述
注意点
- 需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素
解答思路
- 本题可以使用快速排序、堆排序或优先队列解决,快排可以比较快速找到某个元素在数组中排序后的位置,所以找到第k个最大的元素也比较快;堆排序可以删除k次堆顶元素获取到第k个最大的元素,主要消耗的时间在于维护最大堆的过程上;优先队列可以维护一个大小为k的队列(需保证队列中的元素有序,队顶元素是队列中最小的元素),通过不断比较堆顶元素和数组元素,如果大于则替换队顶元素,遍历完整个数组后队顶元素就是第k个最大的元素
代码
class Solution {
public int findKthLargest(int[] nums, int k) {
// 优先队列,根据元素值排序
PriorityQueue<Integer> queue = new PriorityQueue<>(k, Comparator.comparingInt(a -> a));
for (int i = 0; i < k; i++) {
queue.offer(nums[i]);
}
int res = 0;
for (int i = k; i < nums.length; i++) {
if (nums[i] > queue.peek()) {
queue.poll();
queue.offer(nums[i]);
}
}
return queue.peek();
}
}
关键点
- 学习优先队列
- 学习堆排序