Number of Islands

Given a 2d grid map of'1's (land) and'0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

Example 1:

11110
11010
11000
00000

Answer: 1

Example 2:

11000
11000
00100
00011

Answer: 3

这题的目标就是要找到所有都是1的连接块的个数。

我们可以把整个 matrix 都过一遍,遇到一个1我们就把 count+1, 然后我们再从这个坐标使用 bfs 或者 dfs,来把这个1 连接在一起的其他的1都找到,然后把它们全部都变成0来表示我们已经访问过了,然后我们的 循环找到下一个1 在重复这样的工作,我们就能找到所有的连接块了。

DFS

class Solution(object):
    def numIslands(self, grid):
        """
        :type grid: List[List[str]]
        :rtype: int
        """
        # 先判断行是否为0,再判断列是否为0
        if len(grid) == 0 or len(grid[0]) == 0:
            return 0
        row = len(grid)
        col = len(grid[0])
        count = 0

        for i in range(row):
            for j in range(col):
                if grid[i][j] == '1':
                    count += 1
                    self.dfsHelper(grid, i, j)
        return count

    def dfsHelper(self, grid, i, j):
        if grid[i][j] == '0':
            return
        grid[i][j] = '0'
        # up
        if i-1 >= 0:
            self.dfsHelper(grid, i-1, j)
        # down 
        if i+1<=len(grid)-1:
            self.dfsHelper(grid, i+1, j)
        # left
        if j-1>=0:
            self.dfsHelper(grid, i, j-1)
        # right
        if j+1<=len(grid[0])-1:
            self.dfsHelper(grid, i, j+1)

BFS

BFS is to search and store every possible directions(solutions) using a queue usually, then search from the head of the queue each time.

class Solution(object):
    def numIslands(self, grid):
        """
        :type grid: List[List[str]]
        :rtype: int
        """
        # 先判断行是否为0,再判断列是否为0
        if len(grid) == 0 or len(grid[0]) == 0:
            return 0
        row = len(grid)
        col = len(grid[0])
        count = 0

        for i in range(row):
            for j in range(col):
                if grid[i][j] == '1':
                    count += 1
                    self.bfsHelper(grid, i, j)
        return count

    def bfsHelper(self, grid, i, j):
        queue = [(i,j)]
        while queue:
            x,y = queue.pop(0)
            if grid[x][y] == '0':
                continue
            grid[x][y] = '0'
            # up
            if x-1 >= 0:
                queue.append((x-1, y))
            # down 
            if x+1<=len(grid)-1:
                queue.append((x+1,y))
            # left
            if y-1>=0:
                queue.append((x,y-1))
            # right
            if y+1<=len(grid[0])-1:
                queue.append((x,y+1))

Union Find

Last updated

Was this helpful?