100240. 最小化曼哈顿距离
-
【图解】曼哈顿距离转切比雪夫距离(Python/Java/C++/Go) (几何的证明法)
-
更加数学的
总而言之, 对于点 (x1,y1),(x2,y2) 曼哈顿距离 为: ∣x1−x2∣+∣y1−y2∣
其有如下关系: ∣x1−x2∣+∣y1−y2∣=max(∣x1′−x2′∣,∣y1′−y2′∣)
其中 (x′,y′)=(y+x,y−x)
∣x1−x2∣+∣y1−y2∣=max(x1−x2,x2−x1)+max(y1−y2,y2−y1) =max((x1−x2)+(y1−y2),(x1−x2)+(y2−y1),(x2−x1)+(y1−y2),(x2−x1)+(y2−y1))[分配律] =max((x1+y1)−(x2+y2),(y2−x2)−(y1−x1),(y1−x1)−(y2−x2),(x2+y2)−(x1+y1))[将上面的x1和y1放一起,整理有] =max(∣(x1+y1)−(x2+y2)∣,∣(y1−x1)−(y2−x2)∣) 现在令 x′为y+x, y′为y−x 亦有 ∣x1−x2∣+∣y1−y2∣=max(∣x1′−x2′∣,∣y1′−y2′∣) 证毕
因为需要的是去掉一个点后的最值, 则可以 尝试 去掉该点, 即可
为什么需要两个multiset<int>
, 而不是一个已经计算好的 multiset = max(x', y') ?
那么你需要理解一下 曼哈顿距离转切比雪夫距离 的几何意义:
即 曼哈顿距离 是 在 比雪夫距离 坐标系下 x 或者 y 坐标距离原点的距离
即 点 映射到x/y坐标轴上距离原点更远的那个才是 曼哈顿距离
两个点的曼哈顿距离是 ∣x1−x2∣+∣y1−y2∣=max(∣x1′−x2′∣,∣y1′−y2′∣) 但是它不等价于 max(∣max(x1′,y1′)−max(x2′,y2′)∣) 因此需要两个set
class Solution {
public:
int minimumDistance(vector<vector<int>>& points) {
multiset<int> x;
multiset<int> y;
for (auto& it : points) {
x.insert(it[1] + it[0]);
y.insert(it[1] - it[0]);
}
int res = 1e9;
for (auto& it : points) {
int xd = it[0] + it[1];
int yd = it[1] - it[0];
x.erase(x.find(xd));
y.erase(y.find(yd));
res = min(res, max(*x.rbegin() - *x.begin(), *y.rbegin() - *y.begin()));
x.insert(xd);
y.insert(yd);
}
return res;
}
};