public Point[] kClosest(Point[] points, Point origin, int k) {
if(points == null) return points;
final Point o = origin;
PriorityQueue<Point> pq = new PriorityQueue<Point>(k, new Comparator<Point>(){
@Override
public int compare(Point a, Point b){
return getDistance(b, o) - getDistance(a, o);
}
});
for(Point p : points) {
pq.offer(p);
if(pq.size() > k)
pq.poll();
}
if(k >= points.length) {
k = points.length;
}
Point[] ans = new Point[k];
while(!pq.isEmpty()) {
ans[--k] = pq.poll();
}
return ans;
}
public static int getDistance(Point a, Point b){
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}