🌈【LeetCode 547. 省份数量 】- JavaScript(DSF+并查集)

167 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


【LeetCode 547. 省份数量 】- JavaScript(DSF+并查集)

题目描述

有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。

省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。

给你一个 n x n 的矩阵 isConnected ,其中isConnected[i][j] = 1表示第 i 个城市和第 j 个城市直接相连,而isConnected[i][j] = 0表示二者不直接相连。

返回矩阵中 省份 的数量。

示例 1:

image.png

输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2

DFS深度优先搜索

思路:dfs, 遍历所有城市,对于每个城市,假如这个城市没有被访问过,就从这个城市开始搜索,找到与这个城市相连的全部城市。遍历完全部城市后,即可得到连通分量的总数。

function findCircleNum(isConnected: number[][]): number {
    const len=isConnected.length
    const visited=Array(len).fill(false)
    let count=0
    const dfs=(i)=>{
        visited[i]=true
        const cur=isConnected[i]
        for(let j=0;j<len;j++){
            if(cur[j]&&!visited[j]){
                dfs(j)
            }
        }
    }
    for(let i=0;i<len;i++){
        if(!visited[i]){
            dfs(i)
            count++
        }
    }
    return count
};

并查集

其实上面的思路和并查集的思路也很相似,都是利用了一个visited数组。例如这个矩阵是一个无向图的邻接矩阵,对每个成员进行遍历,找到其朋友关系的连接并标记一下,每找到一个朋友就要以此为成员进行dfs,找到一个大的朋友圈关系。

var findCircleNum = function(isConnected) {
    const provinces = isConnected.length;
    const parent = new Array(provinces).fill(0);
    for (let i = 0; i < provinces; i++) {
        parent[i] = i;
    }
    for (let i = 0; i < provinces; i++) {
        for (let j = i + 1; j < provinces; j++) {
            if (isConnected[i][j] == 1) {
                union(parent, i, j);
            }
        }
    }
    let circles = 0;
    for (let i = 0; i < provinces; i++) {
        if (parent[i] === i) {
            circles++;
        }
    }
    return circles;
};
​
const union = (parent, index1, index2) => {
    parent[find(parent, index1)] = find(parent, index2);
}
​
const find = (parent, index) => {
    if (parent[index] !== index) {
        parent[index] = find(parent, parent[index]);
    }
    return parent[index];
}

感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤