← Back to library
#200MediumGraphBFS AIに質問leetcode ↗

Number of Islands

'1'(陸地)と '0'(水)からなる 2 次元グリッド grid が与えられる。島の数を返す。島は水で囲まれた陸地の連結成分。

Example 1:

Input: grid = [
  ["1","1","1","1","0"],
  ["1","1","0","1","0"],
  ["1","1","0","0","0"],
  ["0","0","0","0","0"]
]
Output: 1

Example 2:

Input: grid = [
  ["1","1","0","0","0"],
  ["1","1","0","0","0"],
  ["0","0","1","0","0"],
  ["0","0","0","1","1"]
]
Output: 3

Constraints:

  • 1grid.length,grid[0].length3001 \leq \text{grid.length}, \text{grid[0].length} \leq 300
  • grid[i][j]'0''1'
使用した概念BFS

アプローチ

思考
  • 未訪問の '1' を見つけたらカウントを増やし、DFS で連結する陸地をすべて '0' に塗りつぶす
  • グリッドを直接書き換えて訪問済み管理を行う
実装
class Solution:
    def numIslands(self, grid: list[list[str]]) -> int:
        rows, cols = len(grid), len(grid[0])

        def dfs(r: int, c: int) -> None:
            if r < 0 or r >= rows or c < 0 or c >= cols or grid[r][c] != '1':
                return
            grid[r][c] = '0'
            dfs(r + 1, c); dfs(r - 1, c)
            dfs(r, c + 1); dfs(r, c - 1)

        count = 0
        for r in range(rows):
            for c in range(cols):
                if grid[r][c] == '1':
                    count += 1
                    dfs(r, c)
        return count
Time Space