题目链接
题目分析
看着这个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
个),我们再遍历一次点集合,取距离小于这个分割线的元素即可~~