DFS基本思想
- 本质是遍历决策树
- 关注路径、选择列表、结束条件
- 结合回溯:重点是撤销选择
1 | result = [] |
二叉树的DFS
对于二叉树,我们一般这样做DFS:
1 | def dfs(root): |
更多二叉树的遍历,可以看我的另一篇文章:二叉树的遍历
网格类问题的DFS
类比二叉树的DFS,我们可以总结出网格类问题的DFS:
1 | row,col=len(grid),len(grid[0]) |
避免重复遍历:
我们可以创建一个seen或visited来记录已访问过的网格
1 | row,col=len(grid),len(grid[0]) |
总结模板:
1 | row,col=len(grid),len(grid[0]) |
需要注意
grid[i][j]
为(0,1)或(‘0’ , ‘1’)
岛屿数量
直接套模板就行
1 | class Solution: |
岛屿的最大面积
注意结束搜索时return 0 且dfs返回:1+dfs(上)+dfs(下)+dfs(左)+dfs(右)
1 | class Solution: |
最大人工岛
做两次DFS,第一次标记不同岛屿及其面积;第二次对每一个海洋,寻找其能串联的不同岛屿的面积之和
1 | class Solution: |
岛屿的周长
岛屿的周长,实际上就是由dfs停止搜索时的遇到的边界构成:
- 当遇到边界而停止搜索时,岛屿增加一条边
- 当遇到海洋而停止搜索时,岛屿增加一条边
- 当遇到已搜而停止搜索时,岛屿不增加边
1 | class Solution: |
统计子岛屿
与岛屿数量是一样的做法,只不过需要再用path记录每个岛屿包含的格子
当一个岛屿的所有格子都被包含在grid1中时,res+=1
1 | class Solution: |
统计封闭岛屿的数目
从边界退出的,不是封闭岛屿
1 | class Solution: |
可以试试用变量flag=1代替flag=[1],看看结果对不对