leetcode算法题基础(二十一)广度优先(三)200. 岛屿数量

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

提示:

m == grid.length
n == grid[i].length
1 <= m, n <= 300
grid[i][j] 的值为 '0' 或 '1'

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-islands
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

BFS算法思路:
建立一个mark数组,记录grid中满足条件的陆地‘1’对应的位置是否已被访问。建立一个队列,搜索使用。
(1)设置搜索队列Q(或能够满足FIFO的其他数据结构),标记mark[x][y]为1,并将待搜索的位置(x,y)push进入队列Q。


(2)只要队列不为空,则取队头元素,按照方向数组的4个方向,拓展4个新位置newx,newy。


(3)若新位置不在地图范围内, 则忽略。


(4)如果新位置未曾到达过(mark[newx][newy]为0)、 且是陆地(grid[newx][newy]为“1”),该新位置push进入队列, 并标记mark[newx][newy] = 1。

class Solution(object):
    def numIslands(self, grid):
        """
        :type grid: List[List[str]]
        :rtype: int
        """
        res = 0
        if len(grid) == 0:
            return res
        m = len(grid)
        n = len(grid[0])

        mark = [[0] * n for i in range(m)]

        for i in range(m):
            for j in range(n):
                if mark[i][j] == 0 and grid[i][j] == '1':
                    self.bfs(mark, grid, i, j)
                    res += 1
        return res

    # 深度优先搜索:时间优于宽度优先搜索
    def bfs(self, mark, grid, x, y):
        Q = []
        Q.append([x,y])
        mark[x][y] = 1
        dx = [-1, 1, 0, 0]  # 方向数组
        dy = [0, 0, -1, 1]
        m = len(grid)
        n = len(grid[0])
        # 遍历上下左右四个方向
        while Q:
            temp = Q.pop(0)
            x = temp[0]
            y = temp[1]
            for i in range(4):
                newx = dx[i]+x
                newy = dy[i]+y
                if newx < 0 or newx >= m or newy >= n or newy < 0:
                    continue
                if mark[newx][newy] == 0 and grid[newx][newy] == '1':
                    Q.append([newx, newy])  # 将新位置进入队列
                    mark[newx][newy] = 1

本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/14003569.html

原文地址:https://www.cnblogs.com/qiu-hua/p/14003569.html