LeetCode 中级 - 岛屿的个数

岛屿的个数

给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

示例 1:

输入:
11110
11010
11000
00000

输出: 1

示例 2:

输入:
11000
11000
00100
00011

输出: 3

分析

这道题实质就是找有多少不相连的1字块,与其说是回溯,倒更像是深搜DFS,起始本质也差不多。每次遇到1则向一个方向扩散,直到遇到0时,回溯到上一个1处,再向另外一个方向扩散。不撞南墙不回头,撞到南墙回头之后,接着撞北墙,西墙,东墙。。思路差不多就是这样。

不过需要注意的是,我们扩散时,可以直接将1置0,这样深搜时不会使外层矩阵遍历重复计数

代码

    class Solution {
        //遍历数组,遇到1,则将其周围所有1都置0,循环操作
        public int numIslands(char[][] grid) {
            if(grid.length == 0 || grid[0].length ==0){
                return 0;
            }
            int rows = grid.length;
            int cols = grid[0].length;
            int res = 0;
            for(int i=0;i<rows;i++){
                for(int j=0;j<cols;j++){
                    if(grid[i][j]=='1'){
                        res++;
                        toZero(grid,i,j,rows,cols);
                    }
                }
            }
            return res;
        }
        private void toZero(char[][] grid,int i,int j,int rows,int cols){
            if(i<0 || i>=rows || j<0 || j>=cols){
                return ;
            }
            if(grid[i][j]!='1'){
                return;
            }
            grid[i][j]='0';
            toZero(grid,i+1,j,rows,cols);
            toZero(grid,i-1,j,rows,cols);
            toZero(grid,i,j+1,rows,cols);
            toZero(grid,i,j-1,rows,cols);
        }
    }

猜你喜欢

转载自blog.csdn.net/whdalive/article/details/80421461