岛屿的个数
题目
给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直
方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
分析:
我们设定:当第一次遇见值为1的时候,就对周边上下左右的1都进行感染,那么属于这个岛的1就会被一次感染完。如果遇到其他岛屿的1的话,重复以上操作。我们可以根据几次感染的次数对岛屿的个数进行估计,最后就可以得到我们需要统计的岛屿的个数。
package codingTest6;
public class numIslands {
public static int numIslands(int[][] grid) {
if(grid.length == 0 || grid[0].length == 0) {
return 0;
}
int N = grid.length;
int M = grid[0].length;
int res = 0;
for(int i = 0; i < N; i++) {//逐个遍历每个位置上的元素
for(int j = 0; j < M; j++) {
if(grid[i][j] == 1) {//如果发现当前位置的数为1,则岛数量加1,并且感染相邻位置的数
res ++;
infect(grid, i, j, N, M);
}
}
}
return res;
}
public static void infect(int[][] m, int i, int j, int N, int M) {
if(i < 0 ||i >= N ||j < 0 || j >= M || m[i][j] != 1) {//越界或者当前的数字不为1时候,就不执行
return ;
}
m[i][j] = 2;
infect(m, i+1, j, N, M);//感染它的上一个数
infect(m, i-1, j, N, M);//感染它的下一个数
infect(m, i, j+1, N, M);//感染它的左一个数
infect(m, i, j-1, N, M);//感染它的右一个数
}
public static void main(String[] args) {
int[][] m1 = {{1,1,1,1,0},
{1,1,0,1,0},
{1,1,0,0,0},
{0,0,0,0,0},};
int[][] m2 = {{1,1,0,0,0},
{1,1,0,0,0},
{0,0,1,0,0},
{0,0,0,1,1},};
int[][] m3 = {{1,1,1,1,0},
{1,1,0,1,0},
{1,1,0,0,0},
{0,0,0,0,0},};
System.out.println(numIslands(m1));
System.out.println(numIslands(m2));
System.out.println(numIslands(m3));
}
}