
方法一:
java
class Solution {
public int numIslands(char[][] grid) {
//空网格判断
if(grid == null || grid.length == 0){
return 0;
}
int count = 0;
int row = grid.length;
int cols = grid[0].length;
//循环遍历每一个网格
for(int r = 0; r < row; r++){
for(int c = 0; c < cols; c++){
if(grid[r][c] == '1'){
count++;
//将该网格以及上下左右的网格置为0
sinkIsland(grid, r, c);
}
}
}
return count;
}
//处理'1'以及周边置为'0'
private void sinkIsland(char[][] grid, int r, int c){
if(r < 0 || r >= grid.length || c < 0 || c >= grid[0].length || grid[r][c] == '0'){
return;
}
grid[r][c] = '0';
sinkIsland(grid, r - 1, c);
sinkIsland(grid, r, c - 1);
sinkIsland(grid, r + 1,c);
sinkIsland(grid, r, c +1);
}
}

这里注意图里面给的都是字符,所以在比较的时候应该使用'0'而不是直接0;另外"="是赋值运算符,"=="是比较运算符,返回的是true和false。
方法二:
java
class Solution {
public int numIslands(char[][] grid) {
//空网格判断
if(grid == null || grid.length == 0){
return 0;
}
int count = 0;
int row = grid.length;
int cols = grid[0].length;
boolean[][] visited = new boolean[row][cols];
//循环遍历每一个网格
for(int r = 0; r < row; r++){
for(int c = 0; c < cols; c++){
if(grid[r][c] == '1' && !visited[r][c]){
count++;
dfs(grid, r, c,visited);
}
}
}
return count;
}
//在新建的二维数组visited上进行操作
private void dfs(char[][] grid, int r, int c, boolean[][] visited){
if(r < 0 || r >= grid.length || c < 0 || c >= grid[0].length || grid[r][c] == '0' || visited[r][c]){
return;
}
visited[r][c] = true;
dfs(grid, r - 1, c, visited);
dfs(grid, r, c - 1, visited);
dfs(grid, r + 1, c, visited);
dfs(grid, r, c +1, visited);
}
}

方法一的思路是在原数组上做修改,但是实际业务中可能不允许这样做,所以引出了第二种方法,新建了一个二维数组,与方法一直接在原来数组上进行置0操作不同的地方在于,方法二在新建的boolean数组中进行将默认的false置为true的操作。
方法二思路:
循环遍历元素,只有满足该格为1且boolean数组为true才count++,然后在boolean数组中将身边的元素置为true,这样下次遍历的这里的时候就不会执行count++操作了;需要注意的是在双层循环的遍历条件中!visited[r][c]这个条件的使用,因为初始化数组是false;另外后续将boolean数组中的元素置为ture从而可以实现在后续的循环中当作fasle进行跳过的步骤。