【leetcode】岛屿的个数

本文介绍了一种计算二维网格中岛屿数量的算法。通过遍历每个网格单元,一旦发现陆地(标记为'1'),即开始感染并标记其相连的陆地,以此统计独立岛屿的数量。文章提供了详细的算法实现过程及示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

岛屿的个数

题目       

        给定一个由 ‘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));
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值