题目描述(🔗)
遇到这道题的时候,我一开始思想确实想到了昨天总结的那道题,确定社交圈的个数。其实判断岛屿的个数就是判断社交圈的个数,都是图算法——判断连通子图的个数。
- 那么就可以用并查集来做,只不过这里的输入需要做一次转变,需要把元素的领接关系转换成元组边(i, j)表示岛屿i 和岛屿j 相邻。这种关系转换麻烦。。。
- 还有判断连通子图不是还有DFS么,只不过需要领接矩阵,注意这里的输入并不是领接矩阵,领接矩阵需要转换成grid中岛屿元素的个数(n*n) * (n*n)大小,来表明领接关系
这里的算法思想对DFS做了很巧妙的变通,非常精髓!
算法思想:
遍历矩阵(i, j)。
如果该元素为岛屿,岛屿数量+1,接着深度遍历该元素;
深度遍历逻辑:
- 首先将该元素置为水域
- 分别判断该元素的周围位置是否为岛屿。如果为岛屿,则对该位置进行深度遍历
中心思想:边遍历边修改矩阵,非常棒!!!
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
'''
主函数 遍历矩阵元素 为岛屿则dfs
'''
self.n, self.m = len(grid), len(grid[0])
summ = 0
for i in range(self.n):
for j in range(self.m):
if grid[i][j] == '1':
summ+=1
self.dfs(grid, i, j)
return summ
def dfs(self,grid, i, j):
'''
dfs 修改元素值 dfs递归调用周围岛屿元素
'''
grid[i][j] = '0'
if i-1>=0 and grid[i-1][j]=='1': self.dfs(grid, i-1, j)
if i+1<self.n and grid[i+1][j]=='1': self.dfs(grid, i+1, j)
if j-1>=0 and grid[i][j-1]=='1':self.dfs(grid, i, j-1)
if j+1<self.m and grid[i][j+1]=='1': self.dfs(grid, i, j+1)