LeetCode 200 [Number of Islands]

原题

给一个01矩阵,求不同的岛屿的个数。
0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。

样例
在矩阵:

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

中有 3 个岛.

解题思路

  • 本题就是无向图中求连通块的二维表示,所以同样可以采用DFS解决。使用Union Find大材小用了
  • 设计一个removeIsland函数,每次遇到1就DFS进行查找把上下左右相邻的1都变成0
  • 最后,两层for循环遍历二维数组,遇到1调用removeIsland函数

完整代码

class Solution(object):
    def __init__(self):
        self.dx = [1, 0, 0, -1]
        self.dy = [0, 1, -1, 0]
        self.m = 0
        self.n = 0
    
    def removeIsland(self, grid, x, y):
        grid[x][y] = '0';
        for i in range(4):
            nextX = x + self.dx[i]
            nextY = y + self.dy[i]
            if nextX >= 0 and nextX < self.n and nextY >= 0 and nextY < self.m:
                if grid[nextX][nextY] == '1':
                    self.removeIsland(grid, nextX, nextY)

    def numIslands(self, grid):
        """
        :type grid: List[List[str]]
        :rtype: int
        """
        self.n = len(grid)
        if self.n == 0:
            return 0
        
        self.m = len(grid[0])
        if self.m == 0:
            return 0
        
        count = 0
        for i in range(self.n):
            for j in range(self.m):
                if grid[i][j] == '1':
                    self.removeIsland(grid, i, j)
                    count += 1
        
        return count

你可能感兴趣的:(LeetCode 200 [Number of Islands])