岛屿的数量-leetcode

题目描述

给你一个由 '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'

解法一

思路:

逐行扫描,对于一个为1的陆地作为起点,深度遍历其上下左右,直到碰到0,并且对于遍历过程中将等于1的陆地改为0,这样就将这片陆地的所有土地扫描结束并且全部置为0,再选择新的起点进行同样的操作。

代码:

class Solution {
    public void dfs(char[][] grid , int row , int col) {
        int nr=grid.length;
        int nc=grid[0].length;

        grid[row][col]='0';
        if(row-1>=0 && grid[row-1][col]=='1')dfs(grid,row-1,col);
        if(row+1<nr && grid[row+1][col]=='1')dfs(grid,row+1,col);
        if(col-1>=0 && grid[row][col-1]=='1')dfs(grid,row,col-1);
        if(col+1<nc && grid[row][col+1]=='1')dfs(grid,row,col+1);
    }

    public int numIslands(char[][] grid) {
        int numIslands=0;
        int nr=grid.length;
        if(nr==0)return numIslands;
        int nc=grid[0].length;
        for(int i=0;i<nr;i++){
            for(int j=0;j<nc;j++){
                if(grid[i][j]=='1'){
                    numIslands++;
                    dfs(grid,i,j);
                }
            }
        }
        return numIslands;

    }
}
posted @ 2026-03-25 22:39  狐狸胡兔  阅读(3)  评论(0)    收藏  举报