[路飞]冗余连接

140 阅读1分钟

记录 1 道算法题

冗余连接

leetcode-cn.com/problems/re…


给定 n 个点,然后连 n 条边,连接不能产生闭环。返回导致闭环的边。

比如:

[1,2] [2,3] [1,3] 其中最后一条线 [1,3],导致了闭环,返回 [1,3]。

[3,4] [1,2] [2,4] [3,5] [2,5] 其中最后一条线 [2,5],导致了闭环,返回 [2,5]。

[1,4] [3,4] [1,3] [1,2] [4,5] 其中第三条线 [1,3],导致了闭环,返回 [1,3]。

这种分类问题,我们可以用并查集来解决。如果我们第一次出现的点形成一个连接,闭环就是两个点都出现了第二次,这时候他们通过并查集查找都找到了同一个祖先,即代表这个是产生闭环的连接。

因为第一次出现的节点,线是不闭环的,但是连线之后会让节点串成糖葫芦,只要不是闭环的线就一定没有共同祖先。

    function findRedundantConnection(edges) {
        const n = edges.length
        // 我们知道有 n 个点, n 条边,
        // 所以我们可以初始化一个都指向自己的数组。
        const parent = Array.from(new Array(n+1), (_, i) => i)

        for(let i = 0; i < n; i++) {
            // 拿到连接的两个点
            const [a,b] = edges[i]
            let n1,n2
            // 找他们是不是有共同祖先
            if ((n1 = find(parent, a)) === (n2 = find(parent, b))) {
                return edges[i]
            } else {
                // 合格之后串起来
                parent[n1] = n2
            }
        }
    }

    // 经典的路径归并的 find
    function find(parent, i) {
        if (parent[i] !== i) {
            parent[i] = find(parent, parent[i])
        }

        return parent[i]
    }

结束