class Point {
int x;
int y;
Point() {
x = 0;
y = 0;
}
Point(int a, int b) {
x = a;
y = b;
}
@Overridepublic String toString() {
return"[" + x + "," + y + "]";
}
}
思路
计算距离^2,获得与点等长的数组,切距离与点的坐标一一对应。
循环k次,寻找k个最小距离,按照最小距离的下标,并记录最近距离点。
每次比较,都要交换距离调整和点在数组中的位置,防止丢失与重复。
代码
publicstatic Point[] kClosest(Point[] points, Point origin, int k) {
// Write your code hereint[] distance = newint[points.length];
//计算距离^2for (int i = 0; i < points.length; i++) {
distance[i] = (points[i].x - origin.x) * (points[i].x - origin.x)
+ (points[i].y - origin.y) * (points[i].y - origin.y);
}
Point[] ps = new Point[k];
//获取距离最近的k个坐标for (int i = 0; i < k; i++) {
int min = distance[i];
ps[i] = points[i];
for (int j = i + 1; j < distance.length; j++) {
if (min > distance[j]) {
min = distance[j];
//交换,调整对应距离值,防止重复int t = distance[i];
distance[i] = distance[j];
distance[j] = t;
ps[i] = points[j];
//交换,调整对应坐标,防止重复
Point o = points[j];
points[j] = points[i];
points[i] = o;
}
if (min == distance[j]) {
if (points[i].x > points[j].x) {
ps[i] = points[j];
//交换,调整对应坐标,防止重复
Point o = points[j];
points[j] = points[i];
points[i] = o;
} elseif (points[i].x == points[j].x) {
if (points[i].y > points[j].y) {
ps[i] = points[j];
//交换,调整对应坐标,防止重复
Point o = points[j];
points[j] = points[i];
points[i] = o;
}
}
}
}
}
return ps;
}