51.岛屿数量

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例1:

输入:grid = [
["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]
输出:1

示例2:

输入:grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
输出:3

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0' 或 '1'

代码:

class Solution {
    //方向数组,分别代表上下左右四个方向横纵坐标的变化
    int[][] dir = {{-1,0},{0,1},{1,0},{0,-1}};
    public int numIslands(char[][] grid) {
        //res用于记录岛屿数量
        int res = 0;
        //遍历网格
        for(int i=0;i<grid.length;i++){
            for(int j=0;j<grid[i].length;j++){
                //如果当前网格为'1',即当前网格为陆地,才进行递归
                if(grid[i][j] == '1'){
                    //岛屿数量加1
                    res++;
                    //以该陆地为起点进行递归遍历,将所有与该陆地相连的陆地全部标记为'2',表示已经访问过
                    dfs(i,j,grid.length,grid[i].length,grid);
                }
            }
        }
        //返回岛屿数
        return res;
    }
    public void dfs(int x,int y,int m,int n,char[][] grid){
        //标记当前陆地被访问过
        grid[x][y] = '2';
        //按照上下左右四个方向寻找未被标记的陆地
        for(int i=0;i<4;i++){
            int x1 = x + dir[i][0];
            int y1 = y + dir[i][1];
            //如果当前陆地未被标记且未越界,进行递归
            if(x1>=0&&x1<m&&y1>=0&&y1<n&&grid[x1][y1]=='1')dfs(x1,y1,m,n,grid);
        }
    }
}
posted @ 2025-04-30 10:10  回忆、少年  阅读(17)  评论(0)    收藏  举报