省份数量和岛屿数量-两种 DFS 省份数量 计算省份数量,也可以是计算朋友圈的数量。从 1 到 n,一共有 n 个城市,他们的连接关系可以用一个二维数组来表示。
1 2 3 4 5 6 7 const  isConnected = [  [1 , 1 , 0 ],   [1 , 1 , 0 ],   [0 , 0 , 1 ], ]; 
连接具有传递性。i->j 连接,j->k 连接,那么 i->k。 所有相连接的城市(朋友)构成了一个省份(朋友圈)。求所有省份的数量。
这里需要用到 DFS 去搜索,并且需要一个 visited 来记录哪些城市已经被访问过了。 遍历这 n 个城市,如果没有被 visited,省份就加 1。 比如搜索到了城市 i,那么就顺着把 i 这个链条都去访问一遍,并且记录在 visited 里面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 function  dfs (  isConnected: number [][],   visited: boolean [],   i: number ,   m: number   ) {  if  (visited[i]) return ;   visited[i] = true ;   for  (let  j = 0 ; j < m; j++) {     if  (isConnected[i][j]) {       dfs (isConnected, visited, j, m);     }   } } function  findCircleNum (isConnected: number [][] ): number  {  if  (!isConnected.length  || !isConnected[0 ].length ) return  0 ;   const  m = isConnected.length ;   const  visited = Array (m).fill (false );   let  count = 0 ;   for  (let  i = 0 ; i < m; i++) {     if  (!visited[i]) {       count++;       dfs (isConnected, visited, i, m);     }   }   return  count; } 
岛屿数量 使用二维矩阵代表一篇区域,如果 grid[i][j]为 1 代表陆地,如果 grid[i][j]为 0 代表海洋,所有连接的 1 构成一个岛屿,求岛屿的数量。
也是 dfs,遍历整个二维矩阵,如果当前是陆地,就 dfs 搜索这个点的周围区域,并且把周围区域标记为 0。需要向四个方向来进行 dfs。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 function  bfs (grid: string [][], i: number , j: number , m: number , n: number  ) {  const  queue = [[i, j]];   while  (queue.length ) {     const  [a, b] = queue.shift ();     if  (grid[a][b] === "1" ) {       grid[a][b] = "0" ;       if  (a - 1  >= 0  && grid[a - 1 ][b] === "1" ) queue.push ([a - 1 , b]);       if  (a + 1  < m && grid[a + 1 ][b] === "1" ) queue.push ([a + 1 , b]);       if  (b - 1  >= 0  && grid[a][b - 1 ] === "1" ) queue.push ([a, b - 1 ]);       if  (b + 1  < n && grid[a][b + 1 ] === "1" ) queue.push ([a, b + 1 ]);     }   } } function  dfs (grid: string [][], i: number , j: number , m: number , n: number  ) {  if  (i < 0  || i >= m || j < 0  || j >= n || grid[i][j] == "0" ) {     return ;   }   grid[i][j] = "0" ;   const  dirs = [     [1 , 0 ],     [-1 , 0 ],     [0 , -1 ],     [0 , 1 ],   ];   for  (const  [dx, dy] of  dirs) {     dfs (grid, dx + i, dy + j, m, n);   } } function  numIslands (grid: string [][] ): number  {  if  (!grid.length  || !grid[0 ].length ) return  0 ;   const  copy = grid.map ((item ) =>  [...item]);   const  m = copy.length ;   const  n = copy[0 ].length ;   let  count = 0 ;   for  (let  i = 0 ; i < m; i++) {     for  (let  j = 0 ; j < n; j++) {       if  (copy[i][j] == "1" ) {         count++;         dfs (copy, i, j, m, n);       }     }   }   return  count; } 
对比 省份是沿着一个链接链条进行 dfs,并标记 visited 岛屿是沿着一个点,向四个方向进行 dfs,并将 grid 置为 0。