力扣LeetCode: 岛屿数量

邮差的信 提交于 2019-11-26 16:12:52

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

输出: 1

示例 2:
输入:
11000
11000
00100
00011
输出: 3

读题: 1是陆地,0是水,1只有上下左右四个方向有1才能连接
思路: 广度优先搜索,递归 双层for循环找到第一块陆地,陆地数加1,然后搜索陆地上下左右四个方向,搜索到水停止,搜索到边界停止,为了避免重复搜索,将搜索过的陆地标记为’0’,可以理解为在指定区域搜索陆地,找到一块陆地计数1,然后将该陆地击沉到海底,然后继续寻找其他陆地

以下是代码:

class Solution {
    public int numIslands(char[][] grid) {
        //初始化岛屿数量
        int island = 0;
        // 如果二维数组为空,则返回0
        if (grid.length==0){
            return 0;
        }
        // 以二维数组长度为行数,第一个数组长度为列数,开始广度遍历,为了避免重复遍历,已经遍历的赋值为0
        int rows = grid.length;
        int cols = grid[0].length;
        //找到第一块陆地,然后四个方向探索
        for (int i=0; i<rows ;i++){
            for (int j=0;j < cols;j++){
                // 找到陆地,岛屿数加1,开始探索
                if (grid[i][j]== '1'){
                    island++;
                    searchLand(grid,i,j,rows,cols);
                }
            }
        }
        return island;
    }

    public void searchLand(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';
        //探索上
        searchLand(grid,i-1,j,rows,cols);
        //探索下
        searchLand(grid,i+1,j,rows,cols);
        //探索左
        searchLand(grid,i,j-1,rows,cols);
        //探索右
        searchLand(grid,i,j+1,rows,cols);
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!