题目:
给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] 。连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的绝对值。请你返回将所有点连接的最小总费用。只有任意两点之间 有且仅有 一条简单路径时,才认为所有点都已连接。
思路:
最小生成树,Kruskal算法(基于贪心)
解答:
class Solution(object):
def minCostConnectPoints(self, A):
#此题本质:求最小生成树,采用基于贪心思想的kruskal算法
#依据距离创建一个小根堆distance
distance = []
parents = [i for i in range(len(A))]
res = 0
# 并查集中find的函数,因为union只有一行所以没有分开写
def find(x):
root = x
while parents[root] != root:
parents[root] = parents[parents[root]]
root = parents[root]
return root
# 这里计算每两个点之间的曼哈顿距离距离
for i in range(len(A)):
cur_dis = 0
for j in range(i + 1, len(A)):
heapq.heappush(distance, ((abs(A[i][0] - A[j][0]) + abs(A[i][1] - A[j][1])), i, j))
# 1. 这里使用Kruskal算法,每次弹出最小值
# 2. 如果当前两个点的根节点相同(这两个点在一个集合),
# 则表示之前已经有边连接了,这里就不能再连接了(因为会形成环);
# 如果当前两个点的根节点不相同,
# 则记录结果,然后把这两个点通过并查集的parents连接到一起
for _ in range(len(distance)):
dis, x, y = heapq.heappop(distance)
if find(x) == find(y):
continue
else:
res += dis
parents[find(x)] = find(y)
return res