题解 | #岛屿数量#
岛屿数量
https://www.nowcoder.com/practice/0c9664d1554e466aa107d899418e814e
比较有意思的递归,主要的思路是“扩散”,“占领”。
1、面对一个二维数组,我们需要双重for循环遍历。
2、当我们遍历到当前的元素是一个'1' 那么也就是代表了一块陆地的意思。
3、我们标记当前的位置为一个另外的值,也就是 ‘2’,标识我们占领了,
4、怎么‘扩散’,我们需要从当前点发散,对当前位置的上下左右四个方向,扩散出去。
5、当扩散的时候,就又像是从一个点出发,判断当前点是否是陆地,如果是陆地就标记。
6、这样一层套一层的递归调用,当发散出去的都结束的时候,就是递归触发点结束的时候。
7、那么递归的开始点就已经把它所在的岛屿中的所有地点都标记上了‘2’,然后当这个方法结束的时候,也就是岛屿+1.
8、当我们回到for循环的视角的时候,再次判断下一个元素的值,我们发现它是‘2’,就不会再来计数了。只会计数未涉足过的地点。
9、如此便轻松计算出,当前二维数组中相连块的数量。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 判断岛屿数量
* @param grid char字符型二维数组
* @return int整型
*/
int num = 0;
public int solve (char[][] grid) {
for (int i = 0; i < grid.length ; i++){
for(int j = 0; j < grid[i].length; j++){
// 横向
if(grid[i][j] == '1'){
// 匹配到是 '1' 就开始递归扩散占领
dfsLand(grid,i,j);
// 递归停止,也就是岛屿占领完整
num++;
}
}
}
return num;
}
// 递归
public void dfsLand(char[][] grid,int i,int j){
// 什么时候结束
if(i < 0 || i == grid.length || j < 0 || j == grid[i].length || grid[i][j] != '1') {
return;
}
// 扫描到的是岛屿的地方就变成 '2' ,在双重for循环中遍历就不会重复计数了
// 就算递归被重复扫描也只是被重复赋值 '2' 而已。
grid[i][j] = '2';
// 上
dfsLand(grid,i-1,j);
// 下
dfsLand(grid,i,j+1);
// 左
dfsLand(grid,i+1,j);
// 右
dfsLand(grid,i,j-1);
}
}
#递归#


查看11道真题和解析