实现这道题,核心思路在于坐标变换。通过将曼哈顿距离转化为切比雪夫距离,可以把求“最大距离”的问题简化为求“最值差”的问题。
主要步骤是:首先将所有点 (x, y) 变换为 (x+y, x-y),此时原点的曼哈顿距离等于变换后点的切比雪夫距离(即 max(|Δx|, |Δy|))。这样,全局最大曼哈顿距离就变为变换后坐标中 max( (x+y的最大值 - 最小值), (x-y的最大值 - 最小值) )。
因此,我们可以枚举删除每一个点,用有序集合(如 TreeMap)动态维护剩余点的变换坐标,并快速计算出当前的最大距离,记录其中的最小值即可。
```java
import java.util.TreeMap;
class Solution {
public int minimumDistance(int[][] points) {
// 使用 TreeMap 来维护所有点变换后的坐标值,key为坐标值,value为该值的出现次数
TreeMap<Integer, Integer> sumMap = new TreeMap<>(); // 维护 x+y
TreeMap<Integer, Integer> diffMap = new TreeMap<>(); // 维护 x-y
// 1. 初始化所有点,将变换后的坐标加入集合
for (int[] p : points) {
int sum = p[0] + p[1];
int diff = p[0] - p[1];
sumMap.put(sum, sumMap.getOrDefault(sum, 0) + 1);
diffMap.put(diff, diffMap.getOrDefault(diff, 0) + 1);
}
int ans = Integer.MAX_VALUE;
// 2. 尝试移除每一个点
for (int[] p : points) {
int sum = p[0] + p[1];
int diff = p[0] - p[1];
// --- 从集合中移除当前点 ---
// 移除 x+y 值
int cntSum = sumMap.get(sum);
if (cntSum == 1) sumMap.remove(sum);
else sumMap.put(sum, cntSum - 1);
// 移除 x-y 值
int cntDiff = diffMap.get(diff);
if (cntDiff == 1) diffMap.remove(diff);
else diffMap.put(diff, cntDiff - 1);
// --- 计算移除当前点后,剩余点之间的最大曼哈顿距离 ---
// 此时的最大距离 = max( (x+y最大差), (x-y最大差) )
int currentMaxDist = Math.max(
sumMap.lastKey() - sumMap.firstKey(),
diffMap.lastKey() - diffMap.firstKey()
);
// 更新全局答案,取最小值
ans = Math.min(ans, currentMaxDist);
// --- 将当前点重新加回集合,以便下一个循环使用 ---
sumMap.put(sum, sumMap.getOrDefault(sum, 0) + 1);
diffMap.put(diff, diffMap.getOrDefault(diff, 0) + 1);
}
return ans;
}
}
```