美文网首页
手撕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