Hard
You are given a array points
representing integer coordinates of some points on a 2D plane, where points[i] = [xi, yi]
.
The distance between two points is defined as their Manhattan distance.
Return the minimum possible value for maximum distance between any two points by removing exactly one point.
Example 1:
Input: points = [[3,10],[5,15],[10,2],[4,4]]
Output: 12
Explanation:
The maximum distance after removing each point is the following:
|5 - 10| + |15 - 2| = 18
.|3 - 10| + |10 - 2| = 15
.|5 - 4| + |15 - 4| = 12
.|5 - 10| + |15 - 2| = 18
.12 is the minimum possible maximum distance between any two points after removing exactly one point.
Example 2:
Input: points = [[1,1],[1,1],[1,1]]
Output: 0
Explanation:
Removing any of the points results in the maximum distance between any two points of 0.
Constraints:
3 <= points.length <= 105
points[i].length == 2
1 <= points[i][0], points[i][1] <= 108
public class Solution {
private int manhattan(int[][] points, int i, int j) {
return Math.abs(points[i][0] - points[j][0]) + Math.abs(points[i][1] - points[j][1]);
}
private int[] maxManhattanDistance(int[][] points, int remove) {
int n = points.length;
int maxSum = Integer.MIN_VALUE;
int minSum = Integer.MAX_VALUE;
int maxDiff = Integer.MIN_VALUE;
int minDiff = Integer.MAX_VALUE;
int maxSumIndex = -1;
int minSumIndex = -1;
int maxDiffIndex = -1;
int minDiffIndex = -1;
for (int i = 0; i < n; i++) {
if (i != remove) {
int sum = points[i][0] + points[i][1];
int diff = points[i][0] - points[i][1];
if (sum > maxSum) {
maxSumIndex = i;
maxSum = sum;
}
if (sum < minSum) {
minSumIndex = i;
minSum = sum;
}
if (diff > maxDiff) {
maxDiffIndex = i;
maxDiff = diff;
}
if (diff < minDiff) {
minDiffIndex = i;
minDiff = diff;
}
}
}
return Math.max(maxSum - minSum, maxDiff - minDiff) == maxSum - minSum
? new int[] {maxSumIndex, minSumIndex}
: new int[] {maxDiffIndex, minDiffIndex};
}
public int minimumDistance(int[][] points) {
int[] m = maxManhattanDistance(points, -1);
int[] m1 = maxManhattanDistance(points, m[0]);
int[] m2 = maxManhattanDistance(points, m[1]);
return Math.min(manhattan(points, m1[0], m1[1]), manhattan(points, m2[0], m2[1]));
}
}