题目:
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
思路:
1.最直接的思路就是排序后取k-1索引处的值
2.利用快排中的partition函数,partition函数可以在O(n)时间复杂度内找出数组中第k大的数字
3.利用最小堆。设置最小堆的大小为k,循环将数组中的值加入最小堆,当超如k容量时取出最小值,这样完成循环后堆顶即为第k大的数。
代码:
2.partition函数:
1 | public int findKthLargest(int[] nums, int k) { |
2.最小堆
1 | public int findKthLargest1(int[] nums, int k) { |
复杂度分析及总结:
1.partition函数:
时间复杂度:
O(n)。???
空间复杂度:
O(1)。
2.最小堆:
时间复杂度:
O(nlogk)。???
空间复杂度:
O(k)。
总结:
注意Java中堆可以用PriorityQueue实现。