问题描述:
在一维数组中找到第K大的数。
比如说:
数组[3,2,1,5,6,4] k = 2, 返回 5.
解法一:
最容易想到的就是排序整个数组。可以用快速排序的方法。
public int findKthLargest(int[] nums, int k) {
final int N = nums.length;
Arrays.sort(nums);
return nums[N - k];
}
时间复杂度为O(NlogN),空间复杂度是O(1)
解法二:
(1)创建小顶堆,初始化大小为k,堆顶为堆的最大元素。
(2)扫描一遍数组,往最小堆插入数据,如果堆的元素个数达到k个,那么新的元素就需要和堆顶比较,如果小于堆顶,则移除堆顶,插入新元素。
(3)最终我们得到k个最小的元素,时间复杂度为O(nlogk)
public int findKthLargest(int[] nums, int k) {
final PriorityQueue<Integer> pq = new PriorityQueue<>();
for(int val : nums) {
pq.offer(val);
if(pq.size() > k) {
pq.poll();
}
}
return pq.peek();
}