深度优先搜索模板
典型例题与程序示例
典型例题如695. 岛屿的最大面积
示例代码如下
private int m, n;
private int[][] direction = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
public int maxAreaOfIsland(int[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
m = grid.length;
n = grid[0].length;
int maxArea = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
maxArea = Math.max(maxArea, dfs(grid, i, j));
}
}
return maxArea;
}
private int dfs(int[][] grid, int r, int c) {
if (r < 0 || r >= m || c < 0 || c >= n || grid[r][c] == 0) {//判断合法性
return 0;
}
grid[r][c] = 0;//标记已访问
int area = 1;
for (int[] d : direction) {//领域搜索与业务计算
area += dfs(grid, r + d[0], c + d[1]);
}
return area;
}
总结
其实很多dfs的题目在dfs搜索部分可以使用相同的套路解决,所以在此简单总结记录一下
1、首先上来先来一个if判断下合法性,把不符合条件的情况过滤掉,此处合法性判断一般都要判断是否已访问,其实就是过滤掉邻域中不合法和已访问过的元素
2、接下来标记当前元素已访问
3、领域搜索进行递归,同时进行业务计算