建立k个元素的最小堆 (java的优先队列也可)依次判断每个数字,大于堆顶元素进堆进堆
回到上面的取TopK问题上,用最小堆的解决方法就是:
首先建堆:先去源数据中的K个元素放到一个长度为K的数组中去,再把数组转换成最小堆。
取源数据中的K个之后的数据和堆的根节点(数组的第一个元素)比较,根据最小堆的性质,根节点一定是堆中最小的元素,如果小于它,则直接pass,大于的话,就替换掉跟元素,直到源数据遍历结束。
用优先队列:
publicintfindKthLargest(int[] nums,int k){
PriorityQueue minQueue =newPriorityQueue<>(k);for(intnum : nums) {if(minQueue.size() < k || num > minQueue.peek())
minQueue.offer(num);if(minQueue.size() > k)
minQueue.poll();
}
returnminQueue.peek();
}
复杂度nlogk