实现顺序:
-
双层for循环遍历
-
判断A:触发递归逻辑的判断,例如value = '1'(个性化处理内容1)
-
记录岛数量(个性化处理内容2)
-
开始递归DFS,参数x, y, 数组
-
递归结束判断:(x,y各自大于0,各自小于length限制,xy值判断,例如[x][y]=='0'(个性化处理内容3))
-
先修改既有值为5的判断结束,代表当前节点判断结束[x][y]='0'(个性化处理内容3)
-
前后左右独立递归
递归代码:
- 结束判断
- 修改当前节点
- 上下左右修改各节点
class Solution {
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int nr = grid.length;
int nc = grid[0].length;
int lands = 0;
// 1. 双层for循环遍历(固定内容)
for (int r = 0; r < nr; r++) {
for (int c = 0; c < nc ; c ++) {
// 2. 判断A:触发递归逻辑的判断,例如value = '1'(固定内容)
if (grid[r][c] == '1') {
// 记录岛数量(个性化处理内容1)
++ lands;
// 开始递归DFS(固定内容)
dfs(grid, r, c);
}
}
}
return lands;
}
public void dfs(char[][] grid, int r, int c) {
int nr = grid.length;
int nc = grid[0].length;
5. 递归结束判断:(x,y各自大于0,各自小于length限制,xy值判断,例如[x][y]=='0')
if (r < 0 || c < 0|| r >= nr || c >= nc || grid[r][c] == '0') {
return;
}
6. 先修改既有值为5的判断结束,代表当前节点判断结束[x][y]='0'
grid[r][c] = '0';
7. 前后左右独立递归
dfs(grid, r - 1, c);
dfs(grid, r + 1, c);
dfs(grid, r, c - 1);
dfs(grid, r, c + 1);
}
}