200.Number of Islands

25 年 7 月 4 日 星期五
314 字
2 分钟

200. Number of Islands

Screenshot 2026-02-28 at 9.59.01 am

My solution:

js
/**
 * @param {character[][]} grid
 * @return {number}
 */
var numIslands = function (grid) {
  const dfs = (i, j) => {
    // i, j 表示当前坐标
    grid[i][j] = '-1'
    for (const [x, y] of [
      [i + 1, j],
      [i - 1, j],
      [i, j + 1],
      [i, j - 1],
    ]) {
      if (x >= 0 && y >= 0 && x < grid.length && y < grid[0].length) {
        // 越界条件判断
        if (grid[x][y] !== '-1' && grid[x][y] !== '0') {
          // 访问过和水判断
          dfs(x, y)
        }
      }
    }
  }
  let ans = 0
  for (let i = 0; i < grid.length; i++) {
    for (let j = 0; j < grid[0].length; j++) {
      if (grid[i][j] === '1') {
        // 新岛屿
        dfs(i, j)
        ans += 1
      }
    }
  }
  return ans
}

涂色法

python
class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        m, n = len(grid), len(grid[0])
        DIRS = [(0, 1), (0, -1), (1, 0), (-1, 0)]
        def dfs(i: int, j: int) -> None:
            # 出界,或者不是 '1',就不再往下递归
            if i < 0 or i >= m or j < 0 or j >= n or grid[i][j] != '1':
                return
            grid[i][j] = '2'  # 插旗!避免来回横跳无限递归
            for d in DIRS:
                nxt_row = i + d[0]
                nxt_col = j + d[1]
                dfs(nxt_row, nxt_col)

        ans = 0
        for i, row in enumerate(grid):
            for j, c in enumerate(row):
                if c == '1':  # 找到了一个新的岛
                    dfs(i, j)  # 把这个岛插满旗子,这样后面遍历到的 '1' 一定是新的岛
                    ans += 1
        return ans

文章标题:200.Number of Islands

文章作者:Sirui Chen

文章链接:https://blog.siruichen.me/posts/200number_of_islands[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。