2025年--Lc227--200. 岛屿数量(递归,带测试用例)-Java版
1.题目

2.思路
岛屿是1,每座岛屿只能由水平方向和竖直方向上相邻(该元素的上下左右的方向)的陆地陆续连接形成。
(1) 如果是陆地,我们就递归的深度搜索该元素的前后左右的元素。
(2) 从元素1出发,把整块岛屿全部淹没.
岛屿 +1(只在起点处加一次)
递归遍历的逻辑:
判断边界条件,如果是海洋,或者是矩阵外的元素直接return
(1) 把当前陆地“淹没”为水,相当于“已访问”标记
(2)向四个方向扩展,把与当前格连通的陆地都淹没
3.代码实现
带测试用例版
public class numIslands {public int num(char[][] grid){//行数int m= grid.length;//列数int n=grid[0].length;//岛屿数量的计数器int cnt=0;//遍历矩阵for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]=='1') {//如果遇到陆地dfs(grid, i, j);//递归遍历陆地的四周的元素cnt++;//把陆地的起始元素设置为岛屿数量}}}return cnt;}public void dfs(char[][] grid,int i,int j){//判断边界条件,遇到海洋也直接跳过if(i<0||j<0||i>=grid.length||j>=grid[0].length||grid[i][j]=='0'){return;}grid[i][j]='0';//把遍历过的陆地置为0,以及该陆地元素四周的相连元素也置为0;dfs(grid,i+1,j);dfs(grid,i-1,j);dfs(grid,i,j+1);dfs(grid,i,j-1);}public static void main(String[] args){numIslands test=new numIslands();char[][] arr = {{'1', '1', '1', '1', '0'},{'1', '1', '0', '1', '0'},{'1', '1', '0', '0', '0'},{'0', '0', '0', '0', '0'}};int res=test.num(arr);System.out.println(res);}}
leetcode版
class Solution {public int numIslands(char[][] grid) {//行数int m=grid.length;//列数int n=grid[0].length;//岛屿计数int cnt=0;for(int i=0;i<m;i++)//遍历函数{for(int j=0;j<n;j++){//如果是陆地,我们就递归的深度搜索该元素的前后左右的元素if(grid[i][j]=='1'){dfs(grid,i,j);//// 从这里出发,把整块岛屿全部淹没cnt++; // 岛屿 +1(只在起点处加一次)}}}return cnt;}public void dfs(char[][]grid,int i,int j){ //行数int m=grid.length;//列数int n=grid[0].length;if(i<0||j<0||i>=m||j>=n||grid[i][j]=='0'){return;}// 把当前陆地“淹没”为水,相当于“已访问”标记grid[i][j]='0';//向四个方向扩展,把与当前格连通的陆地都淹没dfs(grid,i+1,j);dfs(grid,i-1,j);dfs(grid,i,j-1);dfs(grid,i,j+1);}
}
