【LeetCode 中等题】68-岛屿的个数

题目描述:给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

示例 1:

输入:
11110
11010
11000
00000

输出: 1

示例 2:

输入:
11000
11000
00100
00011

输出: 3

解法1。DFS,有点像那道把O改成X的题,至少在DFS时把相连的O都标记成一样的是一个思路。用visited二维数组表示当前节点是否被访问过,同时只访问是岛屿的格子,即值为1的格子,再DFS递归,递归完毕就让res+1。

  • 视频里把该种类型的算法成为floodfill算法:

    4个方向上的flood-fill算法示例

    Flood fill算法是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法。因为其思路类似洪水从一个区域扩散到所有能到达的区域而得名。在GNU Go扫雷中,Flood Fill算法被用来计算需要被清除的区域。

class Solution(object):
    def numIslands(self, grid):
        """
        :type grid: List[List[str]]
        :rtype: int
        """
        if not grid:
            return 0
        m = len(grid)
        n = len(grid[0])
        if m <= 0 or n <= 0:
            return 0
        visited = [[0 for _ in range(n)] for _ in range(m)]
        res = 0
        for i in range(m):
            for j in range(n):
                if visited[i][j] == 0 and grid[i][j] == '1':
                    res += 1
                    self.dfs(grid, i, j, visited, m, n)
                    
        return res
    
    def dfs(self, grid, i, j ,visited, m, n):
        if i >= 0 and i < m and j >= 0 and j < n and visited[i][j] == 0 and grid[i][j]=='1':
            visited[i][j] = 1
            self.dfs(grid, i-1, j, visited, m, n)
            self.dfs(grid, i+1, j, visited, m, n)
            self.dfs(grid, i, j-1, visited, m, n)
            self.dfs(grid, i, j+1, visited, m, n)
        return
        

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/86293938
今日推荐