声明:小白总结,本意是记录自己的思路,不过希望能帮助别人,那就更好啦,若发现问题,欢迎指正,感谢!!
来源:力扣(LeetCode)
链接:200.岛屿数量
题目
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
输入:
11110
11010
11000
00000
输出: 1
输入:
11000
11000
00100
00011
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。
分析
关于这类问题,类比之前写过的题解13.机器人的运动范围,可以尝试用DFS解决,当然还有许多好的解法,但我太小白了,先记录一下DFS的写法吧~
首先,这道题要求的是岛屿的数量,我们可以知道,‘1’代表陆地,凡是连续到达的‘1’都归为一个岛屿,我们要求有多少不连续的部分,在机器人问题中,我们求的是能到达的范围,换到这里也就是求能连续到达的‘1’的个数。
对于这个问题,我想,要是能写一个函数,把一个坐标所能到达的位置的值都变为‘0’就好啦,这样,既可以避免重复,又可以将‘0’的位置全部排出。
每一次这样的深度搜索,我们可以看做是一个岛屿,因为每次搜索都把连续的搜索完了,当开始下一轮的时候,也就代表又是一个新的岛屿了。哈哈,耶---------
让我们一起来用代码实现吧---------
代码
// java
class Solution {
int count = 0;//记录岛屿数量
public int numIslands(char[][] grid) {
if(grid == null || grid.length == 0){//先排除网格为空的特殊情况
return 0;
}
int m = grid.length;//得到网格的宽度
int n = grid[0].length;//得到网格的长度
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){//遍历每个网格
if(grid[i][j] == '1'){//没访问过,且是陆地
count++;//出现一个新岛屿
dfs(i, j, grid);//搜索它——————
}
}
}
return count;//返回岛屿数量
}
private void dfs(int i, int j, char[][] grid){//实现搜索
int m = grid.length;//同上
int n = grid[0].length;
//访问坐标在网格内,并且是陆地,也没有访问过
if(i < m && i >= 0 && j < n && j >= 0 && grid[i][j] == '1'){
grid[i][j] = '0';//访问这个位置,把它变成水吧
dfs(i, j + 1, grid);//搜搜右边
dfs(i, j - 1, grid);//搜搜左边
dfs(i + 1, j, grid);//搜搜下边
dfs(i - 1, j, grid);//搜搜上边
}
}
}
感谢各位巨巨们的帮助,希望在记录分析题目的条件下算法能有所提升……