题解采用了Weiszfeld算法来解决此问题,这是一种用于寻找一组点的几何中心(Fermat点)的有效方法,即最小化给定点到一个未知点的距离总和。算法流程如下:1. 初始化中心点为所有点坐标的算术平均值。2. 使用迭代方式,基于加权平均来调整中心点位置,权重为每个点到当前中心的逆距离。3. 检查新中心与旧中心的距离,若变化非常小则认为已收敛,结束迭代。4. 返回中心点到所有位置的欧几里得距离之和。
时间复杂度: O(kn),其中n是位置数,k是迭代次数
空间复杂度: O(n),其中n是输入位置的数量
from typing import List
class Solution:
def getMinDistSum(self, positions: List[List[int]]) -> float:
def distance(p1, p2):
return ((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) ** 0.5
def weiszfeld(positions):
x = sum(p[0] for p in positions) / len(positions)
y = sum(p[1] for p in positions) / len(positions)
centroid = [x, y]
threshold = 1e-7
max_iterations = 1000
for _ in range(max_iterations):
total_weight = 0.0
weighted_sum_x = 0.0
weighted_sum_y = 0.0
for p in positions:
dist = distance(centroid, p)
if dist == 0: return p
weight = 1.0 / dist
total_weight += weight
weighted_sum_x += weight * p[0]
weighted_sum_y += weight * p[1]
new_centroid = [weighted_sum_x / total_weight, weighted_sum_y / total_weight]
if distance(new_centroid, centroid) < threshold:
return new_centroid
centroid = new_centroid
return centroid
centroid = weiszfeld(positions)
return sum(distance(centroid, p) for p in positions)
solution = Solution()
print(solution.getMinDistSum([[0, 1], [1, 0], [1, 2], [2, 1]])) # 输出: 4.0
print(solution.getMinDistSum([[1, 1], [3, 3]])) # 输出: 2.82843 (近似值)