Leetcode200. 岛屿数量

200. 岛屿数量

200. 岛屿数量
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
​
示例 1:
输入:
[
['1','1','1','1','0'],
['1','1','0','1','0'],
['1','1','0','0','0'],
['0','0','0','0','0']
]
输出: 1
示例 2:
输入:
[
['1','1','0','0','0'],
['1','1','0','0','0'],
['0','0','1','0','0'],
['0','0','0','1','1']
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

审题:上下左右是1,则就是连在一起的岛屿

分析:

(1)DFS

思路:将二维网格看成一个无向图,竖直或水平相邻的1之间有边

线性扫描所有二维网格,如果该位置为1,则以此位置为根节点,DFS;res += 1

DFS:当前位置(节点)已被访问过,因此置为0,再遍历上下左右四个位置,如果为1,则继续调用DFS

Leetcode200. 岛屿数量_第1张图片

 

复杂度分析:

time:O(M*N) 行列,因为:遍历所有元素,每个最多遍历两次 (从上和左)

space:O(MN) 最坏就是所有网格都是陆地,深度优先搜索深度为 MN

class Solution(object):
    def numIslands(self, grid):
        """
        :type grid: List[List[str]]
        :rtype: int
        """
        res = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                # 遍历所有网格
                if grid[i][j] == "1":
                    # 如果位置为1,则以此位置为起点,深度优先遍历
                    self.dfs(grid, i, j)
                    # 岛屿数+1
                    res += 1
        return res
​
    def dfs(self, grid, i, j):
        # 当前位置已被遍历过,置为0
        grid[i][j] = '0'
        # 遍历上下左右四个位置,如果位置为1,则以此位置为起点,深度优先遍历
        if i - 1 >= 0 and grid[i - 1][j] == '1': 
            self.dfs(grid, i - 1, j)
        if i + 1 < len(grid) and grid[i + 1][j] == '1': 
            self.dfs(grid, i + 1, j)
        if j - 1 >= 0 and grid[i][j - 1] == '1': 
            self.dfs(grid, i, j - 1)
        if j + 1 < len(grid[0]) and grid[i][j + 1] == "1": 
            self.dfs(grid, i, j + 1)
​

动画不错:

https://leetcode-cn.com/problems/number-of-islands/solution/dfs-bfs-bing-cha-ji-python-dai-ma-java-dai-ma-by-l/

 

你可能感兴趣的:(leetcode,python,算法,python,leetcode,算法)