在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
解法一
排序
class Solution {
public int findKthLargest(int[] nums, int k) {
//排序
Arrays.sort(nums);
return nums[nums.length - k];
}
}
解法二
堆
class Solution {
public int findKthLargest(int[] nums, int k) {
//创建一个容量为k的小顶堆
PriorityQueue<Integer> heap = new PriorityQueue<>(k);
//遍历放到堆中
for (int num : nums) {
//如果堆还没满,直接放入
if (heap.size() < k) {
heap.offer(num);
} else {
//如果堆已经满了,判断当前值是否大于堆顶值,如果是就替换
if (num > heap.peek()) {
heap.poll();
heap.offer(num);
}
}
}
//添加完后,栈顶就是第k个大的值
return heap.poll();
}
}
这道题官方应该是想让我们自己用快排或堆排,自己来排序,而不是使用自带的API,可惜我这两个排序都不会,先把这道题放收藏夹里,等学了快排和堆排后再来做。