添加链接描述
解法一:dfs
class Solution:def numIslands(self, grid: List[List[str]]) -> int:# 思路是dfs,使用一个指针遍历元素,如果找到1,就递归把跟这个1连着的1都变成0,用result记录结果if not grid or len(grid)==0:return result=0def dfs(grid,x,y,row,col):if x<0 or y<0 or x>row or y>col or grid[x][y]=='0':return grid[x][y]='0'dfs(grid,x+1,y,row,col)dfs(grid,x-1,y,row,col)dfs(grid,x,y+1,row,col)dfs(grid,x,y-1,row,col)for i in range(len(grid)):for j in range(len(grid[0])):if grid[i][j]=='1':result+=1dfs(grid,i,j,len(grid)-1,len(grid[0])-1)return result
思路:
- 把找到的1用递归的思路把它和它相邻的1都变成0
- 这样就可以一块一块的把所有相邻的岛屿找到
解法二:bfs
class Solution:def numIslands(self, grid: List[List[str]]) -> int:# 思路是使用bfs,使用队列对整个海域进行同化,也是把遇见的1都变为0if not grid or len(grid)==0:return que=collections.deque()reslut=0row=len(grid)col=len(grid[0])for i in range(row):for j in range(col):if grid[i][j]=='1':reslut+=1que.append([i,j])grid[i][j]='0'while que:cur=que.popleft()x=cur[0]y=cur[1]if x-1>=0 and grid[x-1][y]=='1':que.append([x-1,y])grid[x-1][y]='0'if y-1>=0 and grid[x][y-1]=='1':que.append([x,y-1])grid[x][y-1]='0'if x+1<row and grid[x+1][y]=='1':que.append([x+1,y])grid[x+1][y]='0'if y+1<col and grid[x][y+1]=='1':que.append([x,y+1])grid[x][y+1]='0'return reslut
思路:
- 使用bfs,使用队列,依然是把遍历到的1变成0,然后再找到这个1的上下左右,扫荡变为0
- 使用队列维护这个循环,注意放入队列中的是坐标,而不是节点
- 因为只有放坐标进去,我们才能对这个坐标的awsd进行扫荡
解法三:unionfind
未完待续…