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