leetcode每日一题—1584.连接所有点的最小费用

461 篇文章 1 订阅

题目:
给你一个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值