岛屿的数量

293 阅读3分钟

前言

文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…
种一棵树最好的时间是十年前,其次是现在

絮叨

小六六第一眼看的时候,一脸懵逼,哈哈,这个是力扣每日一题推送的,主要是以前都不刷算法的,之后决定重新做人,慢慢刷题路。

题目

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:
11110
11010
11000
00000
输出: 1

示例 2:

输入:
11000
11000
00100
00011
输出: 3

解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

以上就是题目了,小六六跟大家一起来读读题,其实他的意思就是,每一个位置的前后左右能够用1连起来就是一个岛屿,所以小六六画了2个图帮大家理解题目的意思

题解

怎么题目可以使用深度优先和广度优先算法去做,不过小六六就牛逼了,连这2个概念都不清楚,大佬大佬。 如果不清楚这2个概念的你们也可以看下面的文章

虽然小六六不懂这些概念,但是还是跟着把题目做出来了,哈哈,重点是跟着答案。但是我发现明白了思想好像也不难,下面是题目的代码,小六六打算用广度优先撸一下

package com.code.search;

/**
 * @author 小六六
 * @version 1.0
 * @date 2020/4/20 21:10
 *
 */
public class SearchOne {


    //定义打印岛屿个数的方法

    public static int printNum(char[][] grid) {
        //校验一下这个数组
        if (null==grid||grid.length==0)return 0;
        int row=grid.length;
        int column=grid[0].length;

        //定义一个变量来统计岛屿的个数
        int num=0;

        //遍历这个2维数组
        for (int i=0;i<row;i++){
            for (int j=0;j<column;j++){
                //如果等于0就继续循环
                if (grid[i][j]=='0')continue;
                //不然就进行深度搜索
                num++;
                dfs(grid,i,j);
            }
        }
        return num;
    }

    private static void dfs(char[][] grid, int row, int column) {
        int nr = grid.length;
        int nc = grid[0].length;
        //首先确定搜索的范围,超过这个四个最大范围点的,或者是深度遍历的时候本身是0,就直接不搜索了,说明到达最大深度
        if (row<0||column<0||row>=nr||column>=nc||grid[row][column]=='0') return;
        //如果不是达到最大深度,那么我们就继续搜,但是要把本身搜的点记录,也就是题目的变成0
        grid[row][column]='0';
        //然后往上下左右4个点,进行深度搜索
        dfs(grid,row-1,column);
        dfs(grid,row+1,column);
        dfs(grid,row,column-1);
        dfs(grid,row,column+1);

    }

    public static void main(String[] args) {
        //测试类
        char[][] grid= {
                {'1', '1', '0'},
                {'0','1','1'},
                {'1','0','1'}
        };
        int i = printNum(grid);
        System.out.println(i);

    }

}

结尾

答案是2个。 哈哈 ,解法很多,大家可以多去尝试,大家加油吧

日常求赞

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是真粉

创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见

六脉神剑 | 文 【原创】如果本篇博客有任何错误,请批评指教,不胜感激 !