岛屿数量

· 约 2 分钟阅读 · 次阅读 leetcode

给你一个由 ‘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


深度优先遍历

遍历网格中的每个元素,如果为”1”,则答案ans计数加1, 同时启动深度优先遍历,将上下左右四个方向的连接元素全部标记为非”1” 遍历下一个元素

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        def dfs(grid, row, column):
            # 标记着色
            grid[row][column] = ans
            # 上
            if row>0 and grid[row-1][column] == "1":
                dfs(grid, row-1, column)
            # 下
            if row < rows-1 and grid[row+1][column] == "1":
                dfs(grid, row+1, column)
            # 左
            if column>0 and grid[row][column-1] == "1":
                dfs(grid, row, column-1)
            # 右
            if column<columns-1 and grid[row][column+1] == "1":
                dfs(grid, row, column+1)

        rows = len(grid)
        columns = len(grid[0])
        ans = 0
        for i in range(rows):
            for j in range(columns):
                if grid[i][j] == "1":
                    ans += 1
                    dfs(grid, i, j)
        # print(grid)
        return ans

广度优先搜索

这个就是最直观的思路, 用一个队列存储已访问的节点,然后出队列的时候,将其上下左右方向”连通”(即值为1)的元素放入队列

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        rows = len(grid)
        columns = len(grid[0])
        ans = 0

        queue = collections.deque()
        for i in range(rows):
            for j in range(columns):
                if grid[i][j] == "1":
                    ans += 1
                    queue.append((i, j))
                    grid[i][j] = ans
                    queue.append((i, j))
                    while queue:
                        row, column = queue.popleft()
                        if row>0 and grid[row-1][column] == "1":
                            queue.append((row-1, column))
                            grid[row-1][column] = ans
                        if row < rows-1 and grid[row+1][column] == "1":
                            queue.append((row+1, column))
                            grid[row+1][column] = ans
                        if column>0 and grid[row][column-1] == "1":
                            queue.append((row, column-1))
                            grid[row][column-1] = ans
                        if column<columns-1 and grid[row][column+1] == "1":
                            queue.append((row, column+1))
                            grid[row][column+1] = ans
        # print(grid)
        return ans

        

并查集

TODO