手撕LeetCode #684——Python

684. 冗余连接

在本问题中, 树指的是一个连通且无环的无向图。
输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。
结果图是一个以边组成的二维数组。每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边。
返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u < v。

解题思路:
借助并查集的思想,我们可以设置一个父亲集合,其中每一个值表示当前index的父亲index。如果某个index的值是它本身,则说明它是“祖宗”(doge)。比如[3, 2, 0, 3]:0的父亲是3,1的父亲是2,2的父亲是0,3是“祖宗”,即1->2->0->3。那么在本题中,我们拿到某个edge的两个点,让它们分别去找自己的父亲,父亲再去找父亲的父亲......推本溯源返回的结果,如果两个点的根源相同,那么它们的连接会出现环,所以这两个点就是我们要找的答案。

class Solution:
    def findRedundantConnection(self, edges: List[List[int]]) -> List[int]:
        father = [i for i in range(len(edges) + 1)]
        def find_father(num):
            while num != father[num]:
                num = father[num]
            return num
        def union(l, r):
            l = find_father(l)
            r = find_father(r)
            if l != r:
                father[r] = l
                return False
            else:
                return True
        
        for item in edges:
            l, r = item
            if union(l, r):
                return [l, r]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。