记录 1 道算法题
冗余连接
给定 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]
}
结束