Given somepointsand a pointoriginin two dimensional space, findkpoints out of the some points which are nearest toorigin.
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]]
public class Solution_612 {
/**
* @param points a list of points
* @param origin a point
* @param k an integer
* @return the k closest points
*/
//这里不用一个全局变量的话,参数里就要改成final Point origin了
private Point original=null;
public Point[] kClosest(Point[] points, Point origin, int k) {
original=origin;
//这是一个递减栈,栈顶是当前最大的距离
//这里在comparator里面就把distance一样的话按照先x轴再y轴的顺序排好。
Queue<Point> queue=new PriorityQueue<Point>(k,new Comparator<Point>(){
@Override
public int compare(Point a,Point b){
int distance=getdistance(b,original)-getdistance(a,original);
if(distance==0)
return b.x-a.x;
if(distance==0)
return b.y-a.y;
return distance;
}
});
for(int i=0;i<points.length;i++){
if(i<k){
queue.offer(points[i]);
}else{
Point temp=queue.peek();
if(getdistance(temp,original)>getdistance(points[i],original)){
queue.poll();
queue.offer(points[i]);
}
}
}
//虽然一开始定下了queue的size,但是实际还是要再算一遍
int size=queue.size();
Point[] result=new Point[size];
while(!queue.isEmpty()){
result[--size]=queue.poll();
}
return result;
}
public int getdistance(Point a,Point b){
int dis=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
return dis;
}
}