LeetCode Java刷题笔记—200. 岛屿数量

200. 岛屿数量

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

中等难度。使用图的DFS深度优先遍历即可解决。对于找到的某个值为‘1’的点位,记为1个岛屿,然后从当前位置开始,向四周扩散的继续查找该岛屿的范围,同时需要把找到‘1’的位置标记为‘2’,防止重复遍历。

实际上只要有了思路,那么代码很容易看懂!

public int numIslands( char[][] grid ){
   //岛屿计数器
   int islandNum = 0;
   for( int i = 0; i < grid.length; i++ ){
      for( int j = 0; j < grid[ i ].length; j++ ){
         if( grid[ i ][ j ] == '1' ){
            //从当前点开始向四周扩散查找‘1’,并且标记为‘2’
            //也就是标记当前岛屿的范围
            mark( grid, i, j );
            //当前岛屿的范围查找和标记完毕,岛屿数量加一
            islandNum++;
         }
      }
   }
   return islandNum;
}

private void mark( char[][] grid, int i, int j ){
   //如果二位数组查找i、j越界,或者当前值不等于‘1’,说明当前点位属于当前岛屿的边界部分,直接返回
   if( i < 0 || i > grid.length - 1 || j < 0 || j > grid[ 0 ].length - 1 || grid[ i ][ j ] != '1' ){
      return;
   }
   //如果当前值是‘1’,那么标记当前位置
   grid[ i ][ j ] = '2';
   //从当前位置,向四周(上下左右)扩散查找
   mark( grid, i - 1, j );
   mark( grid, i + 1, j );
   mark( grid, i, j - 1 );
   mark( grid, i, j + 1 );
}

你可能感兴趣的:(leetcode,算法,深度优先,200.,岛屿数量)