剑指 Offer II 118. 多余的边

154 阅读1分钟

剑指 Offer II 118. 多余的边

并查集

  • var len = arr.length; 获取长度
  • var parent = new Array(len + 1).fill(0).map((v, i) => i)生成数组,长度为n+1且每一项的值等于下标
  • for (var i = 0; i < len; i++) { 遍历数组
  • if (pi !== pj) { 找到节点res[1]在parent中的位置,找到节点res[1]在parent中的位置,如果不是同一个,则执行连接
  • parent[pi] = pj 把node2的位置 连接 到node1的位置上来,等下次访问到了node1时,其实就是访问到node2
  • return res; 如果找到了相等的了,就返回出来
var findRedundantConnection = function (arr) {
    var len = arr.length;
    var parent = new Array(len + 1).fill(0).map((v, i) => i)
    for (var i = 0; i < len; i++) {
        var res = arr[i]
        var pi = find(parent, res[0])
        var pj = find(parent, res[1])
        if (pi !== pj) {
            parent[pi] = pj
        } else {
            return res
        }
    }
    function find(parent, i) {
        var value = parent[i]
        if (value !== i) { //如果不相等,说明value是i的爸爸
            parent[i] = find(parent, value)//进一步找寻value的爸爸
        }
        return parent[i]
    }
};

测试代码

var edges = [[1,2],[2,3],[3,4],[1,4],[1,5]]
console.log(findRedundantConnection(edges));

未命名文件 (3).jpg