力扣刷题Day 56:岛屿数量(200)
1.题目描述
2.思路
Krahets佬的DFS / BFS思路如下:
方法1(DFS):遍历整个矩阵,遇到grid[i][j] == "1"时以DFS的方法向上下左右搜索相邻陆地,最重要的一点是把走过所有陆地的结点都置0以避免后续重复搜索。
方法2(BFS):遍历整个矩阵,遇到grid[i][j] == "1"时以BFS的方法将上下左右的陆地置0。
3.代码(Python3)
方法1:
class Solution:def numIslands(self, grid: List[List[str]]) -> int:def dfs(grid, i, j):if not 0 <= i < row or not 0 <= j < col or grid[i][j] == "0": returngrid[i][j] = "0"dfs(grid, i - 1, j)dfs(grid, i + 1, j)dfs(grid, i, j - 1)dfs(grid, i, j + 1)count, row, col = 0, len(grid), len(grid[0])for i in range(row):for j in range(col):if grid[i][j] == "1":dfs(grid, i, j)count += 1return count
方法2:
class Solution:def numIslands(self, grid: List[List[str]]) -> int:def bfs(grid, i, j):queue = [[i, j]]while queue:[i, j] = queue.pop(0)if 0 <= i < row and 0 <= j < col and grid[i][j] == "1":grid[i][j] = "0"queue += [[i - 1, j], [i + 1, j], [i, j - 1], [i, j + 1]]count, row, col = 0, len(grid), len(grid[0])for i in range(row):for j in range(col):if grid[i][j] == "1":bfs(grid, i, j)count += 1return count
4.执行情况
方法1:
方法2:
5.感想
有史以来做过的第一道图论算法题,完全没有头绪,只能看题解了,看完题解又感觉很简单,以后遇到这种题应该会做了吧。
第一眼感觉DFS比BFS更明了,第二眼其实两种思路都很明了,执行效率也是不相上下。