LC 100240. 最小化曼哈顿距离
https://leetcode.cn/problems/minimize-manhattan-distances/description/
看了评论才大概知道曼哈顿距离的某些特性 距离 - OI Wiki
$$
\begin{align} |xi - xj| + |yi - yj| \\ = max(xi-xj, xj-xi) + max(yi-yj, yj-yi) \\ = max(xi-xj + yi-yj, xi-xj + yj-yi, xj-xi + yi-yj, xj-xi + yj-yi) \\ = max((xi+yi) - (xj + yj), (xi-yi) - (xj-yj), (xj-yj) - (xi-yi), (yj+xj) - (xi+xi))) \\ = max(abs((xi + yi) - (xj + yj)), abs((xi-yi) - (xj - yj))) \end{align}$$
所以最终我们关心的是(x+y), 以及(x-y)之间的最大差值,这个就是集合中中两点之间最大的曼哈顿距离。
class Solution: def minimumDistance(self, points: List[List[int]]) -> int: from sortedcontainers import SortedList s1, s2 = SortedList(), SortedList() for (x, y) in points: s1.add(x + y) s2.add(x - y) ans = 1 << 30 for (x, y) in points: s1.remove(x + y) s2.remove(x - y) a = s1[-1] - s1[0] b = s2[-1] - s2[0] ans = min(ans, max(a, b)) s1.add(x + y) s2.add(x - y) return ans