LeetCode每日一题: 岛屿数量

301 阅读1分钟

简单理解就是找到的"值为1的块"的数量,观察了一下,可以利用深度遍历BFS来解,bfs函数主要的作用就是找到所有和当前位置有关系的位置,然后统一变为0.

  1. 遍历整个二维数组,遇到值为1的时候,调用bfs(arr,x,y)函数. (x,y)为当前位置的坐标;
  2. bfs(arr,x,y)函数会将与x,y连接的整个岛屿都变为0(消灭一块岛屿);

那么岛屿的数量就是步骤1中总共调用bfs的次数n.

class Solution {
    private final char isLand = '1';
    private final char notLand = '0';
    
    public int numIslands(char[][] grid) {
        if(grid==null || grid.length < 1 || grid[0].length < 1){
            return 0;
        }
        int row = grid.length;
        int col = grid[0].length;

        //当前阶段
        int num = 0;
        for(int i = 0;i < row ; i++){
            for(int j = 0; j < col ; j++){
                if(grid[i][j]== isLand){
                    BFS(grid,i,j);
                    num++;
                }
            }
        }
        return num;
    }

    /**
     * BFS
     * 将grid[row][col]相邻的所有岛屿都记录下来
     * @param grid
     */
    private void BFS(char[][] grid,int r,int c){
        //递归函数的终止条件
        //  1. 下标越界
        //  2. 值为 0
        if(c >= grid[0].length || r >= grid.length || r < 0 || c< 0 ||grid[r][c] == notLand){
            return;
        }
        //值变为0
        grid[r][c] = notLand;
        
        BFS(grid,r-1,c);
        BFS(grid,r+1,c);
        BFS(grid,r,c-1);
        BFS(grid,r,c+1);
        return;
    }
}