Medium
思路
- sort array : nlogn
- priority queue : nlogk
- quick select : n
- 选择pq
priority queue
- PriorityQueue首先是一个队列
- offer() 或则 add()
- add(E e)和offer(E e)的语义相同,都是向优先队列中插入元素,只是Queue接口规定二者对插入失败时的处理不同,前者在插入失败时抛出异常,后则则会返回false。
- peek()
- 这个函数就比较简单了,返回优先级队列的最小的元素,由于PriorityQueue底层基于最小堆,最小堆又采用数组存储,所以堆顶元素即数组的第一个元素。
- remove()和poll()
- remove()和poll()方法的语义也完全相同,都是获取并删除队首元素,区别是当方法失败时前者抛出异常,后者返回null。
过程
- for循环, offer元素进pq
- 随时保持 pq 里元素数量保持k个
- 最后把k个元素的 pq 的最顶的元素poll出来,返回
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> pq = new PriorityQueue<>();
for(int i = 0; i < nums.length; i++){
pq.add(nums[i]);
if(pq.size() > k)
pq.remove();
}
return pq.poll();
}
}