top k问题解法


建立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




最容易想到的方法是将数据全部排序

你可能感兴趣的:(top k问题解法)