题目
题解:首先会给到我们一系列的坐标点(二维),找出这些坐标里与原点(0,0)距离最短的K个点
所以依次把各个点的距离求出来,然后找出距离最短的K个保存到结果输出就行了
代码部分一(63ms)
class Solution {
public int[][] kClosest(int[][] points, int K) {
Map<Integer,List<Integer>> map = new HashMap();
int[][] res = new int[K][2];
int rank = points.length;
int[] sort = new int[rank];
for(int i = 0; i < rank; i++){
sort[i] = (points[i][0] * points[i][0]) + (points[i][1] * points[i][1]);
List<Integer> list = new ArrayList();
list.add(points[i][0]);
list.add(points[i][1]);
map.put(sort[i],list);
}
Arrays.sort(sort);
for(int i = 0; i < K; i++){
List<Integer> list = new ArrayList();
list = map.get(sort[i]);
res[i][0] = list.get(0);
res[i][1] = list.get(1);
}
return res;
}
}
1.创建一个HashMap来存放(距离-坐标)
2.创建sort[],存放每个坐标与原点的距离并用于排序
3.遍历所有坐标,计算每个坐标与原点的距离的平方,并计算后的距离和坐标一起存入map
4.排序距离
5.找到最小的K个坐标,保存到结果输出
代码部分二(42ms)
class Point{
int x;
int y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
}
class Solution {
public int[][] kClosest(int[][] points, int K) {
Map<Integer,Point> map = new HashMap();
int[][] res = new int[K][2];
int rank = points.length;
int[] sort = new int[rank];
for(int i = 0; i < rank; i++){
sort[i] = (points[i][0] * points[i][0]) + (points[i][1] * points[i][1]);
Point point = new Point(points[i][0], points[i][1]);
map.put(sort[i],point);
}
Arrays.sort(sort);
for(int i = 0; i < K; i++){
Point point = map.get(sort[i]);
res[i][0] = point.x;
res[i][1] = point.y;
}
return res;
}
}
只是声明了一个坐标类存放坐标,减少了查存函数的使用,提高效率