LeetCode 973. 最接近原点的 K 个点

题目链接

973. 最接近原点的 K 个点

题目分析

看着这个TopK的题目,除了快排选择和堆排序外就没想别的东西。我这里直接就把堆排序的做法写出来了。我们维护一个以距离平方为评判标准的最大堆,如果堆的大小大于K,就把堆顶元素移除即可。

代码实现

class Solution {
    public int[][] kClosest(int[][] points, int K) {
PriorityQueue<int[]> queue = new PriorityQueue<>((o1, o2)-> (o2[0] * o2[0] + o2[1] * o2[1]) - (o1[0] * o1[0] + o1[1] * o1[1]));
        for(int[] point : points){
            queue.offer(point);
            while(queue.size() > K){
                queue.poll();
            }
        }
        int[][] res = new int[K][2];
        for(int i = 0; i < K; i++){
            res[i] = queue.poll();
        }
        return res;
    }
}

总结

后来看了官方的解答,才明白是我自己把这个题想复杂了,明明这个题只需要先把所有点的距离平方算出来,然后排序,取第K个元素作为分割线(因为前面的[0,K-2]这个范围内的距离必定小于第K个),我们再遍历一次点集合,取距离小于这个分割线的元素即可~~

原文地址:https://www.cnblogs.com/ZJPaang/p/13790395.html