思路
介绍一下题目中提到的欧几里得距离:
- 首先计算出点到原点的欧几里得距离(这里我们可以简化一步,就是直接计算x和y的平方和,而不需要开根);
- 将二维数组中的点,和其对应的欧几里得距离存放到哈希表中,形成映射关系
- 然后我们创建一个优先队列,存储的元素就是哈希表中的键值对,我们根据值(欧几里得距离),由小到大排列,(实现原理就是小顶堆);
- 遍历哈希表的元素,将元素放入优先队列中,放入的过程中队列会自动根据出现次数由小到大将元素存入;
- 因为要得到最接近原点的K个点,所以我们只需要优先队列中值较小的K个元素(即前K个元素)。 所以我们遍历K次,将优先队列中的前K个元素的值(二维坐标)存到结果集中即可
代码实现(java)
class Solution {
public int[][] kClosest(int[][] points, int k) {
Map<int[], Integer> map = new HashMap<>();
int r = 1;
int[] a = new int[1];
for (int i = 0; i < points.length; i++) {
r = 0;
a = new int[1];
for (int j = 0; j < points[i].length; j++) {
r += (points[i][j] * points[i][j]);
a = points[i];
}
map.put(a, r);
}
Set<Map.Entry<int[], Integer>> entries = map.entrySet();
PriorityQueue<Map.Entry<int[], Integer>> queue = new PriorityQueue<>((o1, o2) -> o1.getValue() - o2.getValue());
for (Map.Entry<int[], Integer> entry : entries) {
queue.add(entry);
}
int[][] res = new int[k][2];
for (int i = 0; i < k; i++) {
final Map.Entry<int[], Integer> poll = queue.poll();
res[i] = poll.getKey();
}
return res;
}
}