赞
踩
分析:
把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); } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。