美文网首页
手撕LeetCode #684——Python

手撕LeetCode #684——Python

作者: 烟花如雨旧故里 | 来源:发表于2020-10-21 17:14 被阅读0次

    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]
    

    相关文章

      网友评论

          本文标题:手撕LeetCode #684——Python

          本文链接:https://www.haomeiwen.com/subject/bgsemktx.html