package com.interview.books.ninechapter;
import com.interview.leetcode.utils.Point;
import java.util.*;
/**
* Created_By: stefanie
* Date: 14-12-12
* Time: 下午3:55
*/
public class NC9_MinDistancePoint {
public Point minDistance(Point[] points){
Point center = new Point(0, 0);
Comparator<Point> xComparator = new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2) {
return o1.x - o2.x;
}
};
Arrays.sort(points, xComparator);
if(points.length % 2 == 1){
center.x = points[points.length/2].x;
} else {
center.x = (points[points.length/2 - 1].x + points[points.length/2].x)/2;
}
Comparator<Point> yComparator = new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2) {
return o1.y - o2.y;
}
};
Arrays.sort(points, yComparator);
if(points.length % 2 == 1){
center.y = points[points.length/2].y;
} else {
center.y = (points[points.length/2 - 1].y + points[points.length/2].y)/2;
}
return center;
}
class DistancePoint extends Point implements Comparable<DistancePoint>{
int distance = 0;
public DistancePoint(int x, int y, Point[] points) {
super(x, y);
distance(points);
}
private void distance(Point[] points){
for(Point point : points){ //|x0-x1| + |y0-y1|.
distance += Math.abs(x - point.x) + Math.abs(y - point.y);
}
}
@Override
public int compareTo(DistancePoint o) {
return distance - o.distance;
}
}
public Point minDistanceNoOverlap(Point[] points){
Set<String> set = new HashSet<>();
for(Point point : points) set.add(point.x + "-" +point.y);
PriorityQueue<DistancePoint> heap = new PriorityQueue<>();
Point center = minDistance(points);
while(set.contains(center.x + "-" + center.y)){
heap.add(new DistancePoint(center.x + 1, center.y, points));
heap.add(new DistancePoint(center.x - 1, center.y, points));
heap.add(new DistancePoint(center.x, center.y + 1, points));
heap.add(new DistancePoint(center.x, center.y - 1, points));
center = heap.poll();
}
return center;
}
public static void main(String[] args){
NC9_MinDistancePoint finder = new NC9_MinDistancePoint();
Point[] points = new Point[4];
points[0] = new Point(1, 2);
points[1] = new Point(2, 3);
points[2] = new Point(3, 1);
points[3] = new Point(1, 4);
Point center = finder.minDistance(points);
System.out.println(center.x + ", " + center.y); //(1,2)
center = finder.minDistanceNoOverlap(points);
System.out.println(center.x + ", " + center.y); //(2,2)
}
}