前言

文本已收录至我的GitHub仓库​

种一棵树最好的时间是十年前,其次是现在

絮叨

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

题目

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

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

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

示例 1:

输入:
11110
11010
11000
00000
输出: 1

示例 2:

输入:
11000
11000
00100
00011
输出: 3

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

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

岛屿的数量_github

岛屿的数量_数组_02

题解

怎么题目可以使用深度优先和广度优先算法去做,不过小六六就牛逼了,连这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);

}

}

岛屿的数量_github_03

结尾

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

岛屿的数量_数组_04

日常求赞

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

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