200. 岛屿数量

给你一个由 '1'(陆地)'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:grid = [

["1","1","1","1","0"],

["1","1","0","1","0"],

["1","1","0","0","0"],

["0","0","0","0","0"]

]

输出:1

示例 2:

输入:grid = [

["1","1","0","0","0"],

["1","1","0","0","0"],

["0","0","1","0","0"],

["0","0","0","1","1"]

]

输出:3

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i] [j] 的值为 '0' 或 '1'

题目链接:200. 岛屿数量 - 力扣(LeetCode) (leetcode-cn.com)

解题思路

深度优先搜索
  • 首先扫描整个 grid 二维数组
  • 找到数值为1的点,以它为起始节点开始进行深度优先搜索
  • 每个搜索到的1都会被重新标记为0,表示已经搜索过,之后把它当水处理
  • 最后返回的岛屿数量就是进入深度优先搜索的次数
  • 深度优先搜索函数就是查看当前位置的上下左右是否为岛屿,如果是就继续深搜,否则返回上一层
class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        m = len(grid)
        n = len(grid[0])
        res = 0
        # 传入参数:当前的grid和当前搜索的坐标点
        def dfs(i,j):
            # 将访问的位置置为0
            grid[i][j] = 0
            nonlocal m,n
            # 上下左右检查是否为岛屿
            for x,y in [(i-1,j),(i+1,j),(i,j-1),(i,j+1)]:
                if 0 <= x < m and 0 <= y < n and grid[x][y] == "1":
                    dfs(x,y)
        for i in range(m):
            for j in range(n):
                if grid[i][j] == "1":
                    res += 1
                    dfs(i,j)
        return res
posted on 2021-10-01 16:57  墩墩儿er  阅读(78)  评论(0)    收藏  举报