题目:

思路:

  1. 逐个检查网格的每个坐标 (i,j)
    1. 若当前位置是未访问的陆地(grid[i][j] == '1'),说明找到一个新岛屿 → 计数 ans += 1
    2. 立即启动 DFS,把这个岛屿的所有连通陆地标记为 “已访问”,避免后续重复计数。
  2. 递归终止条件:若当前坐标 (i,j) 满足以下任一条件,直接返回
    1. 行 / 列越界(i < 0 或 i >= m 或 j < 0 或 j >= n);
    2. 不是未访问的陆地(grid[i][j] != '1',可能是海洋 '0' 或已访问的陆地 '2')。
  3. 标记已访问:将当前陆地 grid[i][j] 改为非 '1' 的值(如 '2'),避免重复递归、无限循环。
  4. 递归遍历四邻域:依次向「上、下、左、右」四个方向递归调用 DFS,直到整个岛屿的所有陆地都被标记。
  5. 每完成一次 DFS(递归遍历完一个岛屿的所有陆地),就代表找到一个独立岛屿,最终 ans 即为岛屿总数。

代码:

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        m,n = len(grid),len(grid[0])
        def dfs(i,j):
            if i<0 or i>=m or j<0 or j>=n or grid[i][j]!='1':
                return 
            if grid[i][j] == '1': #出界,或者不是 '1',就不再往下递归
                grid[i][j] = '2' # 标记!避免来回横跳无限递归
                dfs(i,j+1)
                dfs(i,j-1)
                dfs(i-1,j)
                dfs(i+1,j)
        ans = 0
        for i,row in enumerate(grid):
            for j,col in enumerate(row):
                if col == '1': # 找到了一个新的岛
                    dfs(i,j)  # 把这个岛标记,这样后面遍历到的 '1' 一定是新的岛
                    ans += 1
        return ans

        

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐