Given some points
and a point origin
in
two dimensional space, find k
points out of the some points which are nearest
to origin
.
Return these points sorted by distance, if they are same with distance, sorted by x-axis, otherwise sorted by y-axis.
Example
Given points = [[4,6],[4,7],[4,4],[2,5],[1,1]]
, origin = [0,
0]
, k = 3
return [[1,1],[2,5],[4,4]]
java
/**
* Definition for a point.
* class Point {
* int x;
* int y;
* Point() { x = 0; y = 0; }
* Point(int a, int b) { x = a; y = b; }
* }
*/
public class Solution {
/*
* @param points: a list of points
* @param origin: a point
* @param k: An integer
* @return: the k closest points
*/
public Point[] kClosest(Point[] points, Point origin, int k) {
// write your code here
Comparator<Point> cmp = new Comparator<Point>() {
public int compare(Point A, Point B) {
int ad = getDistance(A.x, origin.x) + getDistance(A.y, origin.y);
int bd = getDistance(B.x, origin.x) + getDistance(B.y, origin.y);
if (ad == bd) {
int axd = A.x - origin.x;
int bxd = B.x - origin.x;
if (axd == bxd) {
int ayd = A.y - origin.y;
int byd = B.y - origin.y;
return -(ayd - byd);
} else {
return -(axd - bxd);
}
} else {
return -(ad - bd);
}
}
};
Queue<Point> queue = new PriorityQueue<>(k + 1, cmp);
for (int i = 0; i < points.length; i++) {
queue.offer(points[i]);
if (queue.size() > k) {
queue.poll();
}
}
Point[] arr = new Point[k];
for (int i = k -1; i >= 0; i--) {
arr[i] = queue.poll();
}
return arr;
}
private int getDistance(int A, int B) {
int val = (A - B) * (A - B);
return val;
}
}