分析:
把1当成陆地,0当成海,简单来说只要上下左右如果是1的话就可以看成一个陆地,从示例中也可以很清楚的看懂。
思路:
用一个和grid大小一样的整型二维数组arr来代表岛屿的生成过程,遍历grid,如果遇到grid[i][j]=‘1’&&arr[i][j]=0(前者代表这是块陆地,后者表示要在arr中生成这块陆地),进入岛屿生产函数createIsLands,createIsLands函数首先要在arr中生成岛屿即arr[i][j]=1,然后判断这块岛屿的上下左右是否满足之前那个条件,如果满足则递归调用createIsLands继续生成岛屿,直到无法再生成岛屿为止,此时大岛屿数量num++,跳出整个大函数,继续遍历grid和arr,直到遍历完为止,类似感染的过程。
解题过程:
①首先肯定是需要定义一个num用来表示岛屿的数量,初始为0
②初始化arr二维数组,大小和grid一样
③遍历二维数组
④当grid[i][j]=‘1’&&arr[i][j]=0时进入岛屿生产函数createIsLands
⑤进入函数,arr[i][j]=1
⑥判断i,j坐标的上下左右是否满足grid[i][j]=‘1’&&arr[i][j]=0且没有数组越界
⑦满足的话递归调用createIsLands直到不能再上次岛屿为止
⑧跳出大createIsLands函数,num++
⑨遍历完毕,return num
代码:
class Solution {
public int numIslands(char[][] grid) {
int num = 0;
int arr[][] = new int[grid.length][grid[0].length];
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (arr[i][j] == 0 && grid[i][j] == '1') {
createIsLands(i , j,grid,arr);
num++;
}
}
}
return num;
}
public static void createIsLands(int i,int j,char[][] grid,int arr[][]) {
arr[i][j] = 1;
if(i - 1 >= 0 && arr[i - 1][j] == 0 && grid[i - 1][j] == '1'){
createIsLands(i - 1, j,grid,arr);
}
if(i + 1 <= grid.length - 1 && arr[i + 1][j] == 0 && grid[i + 1][j] == '1'){
createIsLands(i + 1, j,grid,arr);
}
if(j - 1 >= 0 && arr[i][j - 1] == 0 && grid[i][j - 1] == '1'){
createIsLands(i, j - 1,grid,arr);
}
if(j + 1 <= grid[0].length - 1 && arr[i][j + 1] == 0 && grid[i][j + 1] == '1'){
createIsLands(i, j + 1,grid,arr);
}
}
}