[前端]_一起刷leetcode 547. 省份数量

143 阅读2分钟

大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。

题目

547. 省份数量

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

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

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

返回矩阵中 省份 的数量。

 

示例 1:

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

示例 2:

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

 

提示:

  • 1 <= n <= 200
  • n == isConnected.length
  • n == isConnected[i].length
  • isConnected[i][j] 为 1 或 0
  • isConnected[i][i] == 1
  • isConnected[i][j] == isConnected[j][i]

思路

这道题目跟上一道题目很相似 [路飞]_一起刷leetcode 200. 岛屿数量, 只不过刚刚求的是岛屿数量,陆地是紧挨着的,而现在求的是城市相连数,这两者的差异在哪里呢? 首先岛屿必须是紧密贴着的,所以必须相邻,而城市之间只有一个通了,一排过去全能打通,这就意味着我们的消除方法需要改变。

  1. 两层for循环,去遍历我们矩阵中的每一个元素,如果遍历到的节点值为1,那么进行消除;
  2. 消除的规则同样是递归执行,不过现在我们消除的是整行整列,我们遍历整行和整列,找到节点值为1的就再次递归进行消除。

实现

function findCircleNum(isConnected) {
    const n = isConnected.length;
    let count = 0;

    // 快乐消除
    function dfs(isConnected, i, j) { 
        isConnected[i][j] = 0;
        // 十字消除
        for (let k = 0; k < n; k++) {
            if (isConnected[i][k] === 1) {
                dfs(isConnected, i, k);
            }

            if (isConnected[k][j] === 1) {
                dfs(isConnected, k, j);
            }
        } 
    }

    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            if (isConnected[i][j] === 1) {
                dfs(isConnected, i, j);
                count++;
            }
        }
    }

    return count;
}

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。