51、图论-岛屿数量

思路:

该问题要求在一个由 '1'(表示陆地)和 '0'(表示水)组成的二维网格中,计算岛屿的数量。岛屿被水包围,并且通过水平或垂直连接相邻的陆地可以形成。这个问题的核心是识别并计数网格中相连的陆地块。

方法 numIslands

  1. 初始检查

    • 首先检查输入的二维数组 m 是否为空或格式不正确(例如行或列为0)。如果是,返回0表示没有岛屿。
  2. 定义变量

    • N 表示网格的行数。
    • M 表示网格的列数。
    • res 用来记录岛屿的数量,初始化为0。
  3. 遍历网格

    • 使用双重循环遍历每个单元格。外循环遍历行,内循环遍历列。
  4. 检查陆地并启动感染过程

    • 如果当前单元格的值是 '1',则表示找到了一个新岛屿,岛屿计数 res 增加1。
    • 调用 infect 方法来“感染”相邻的陆地区域,将其标记为已访问。
  5. 返回岛屿数量

    • 遍历完成后,返回总的岛屿数量 res

方法 infect

这是一个递归方法,用于标记和访问与当前单元格相连的所有陆地单元格,以防止它们被重复计数:

  1. 边界和终止条件

    • 检查当前坐标 (i, j) 是否超出网格边界或当前单元格是否不是 '1'。如果是,返回,不做任何操作。
  2. 标记当前单元格

    • 将当前单元格的值从 '1' 修改为 '2',表示这块陆地已经被访问过,以避免重复计数。
  3. 递归感染相邻的陆地

    • 递归调用 infect 方法分别向上、下、左、右四个方向探索,寻找并标记所有相连的陆地。

总结

这个解决方案通过DFS(深度优先搜索)来识别和计数所有的岛屿。每当找到一个未被访问的陆地单元格,就通过递归“感染”过程标记所有与之相连的陆地单元格,防止它们在后续的遍历中被重复计数。这种方法简单高效地解决了岛屿计数问题。

代码如下:

public static int numIslands(char[][] m) {
		if (m == null || m.length == 0 || m[0] == null || m[0].length == 0) {
			return 0;
		}
		int N = m.length;
		int M = m[0].length;
		int res = 0;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if (m[i][j] == '1') {
					res++;
					infect(m, i, j, N, M);
				}
			}
		}
		return res;
	}

	public static void infect(char[][] m, int i, int j, int N, int M) {
		if (i < 0 || i >= N || j < 0 || j >= M || m[i][j] != '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);
	}

 

相关推荐

  1. 】Leetcode 200. 岛屿数量【中等】

    2024-04-22 08:02:02       22 阅读
  2. 【LeetCode热题100】【岛屿数量

    2024-04-22 08:02:02       10 阅读
  3. hot100-/岛屿问题

    2024-04-22 08:02:02       20 阅读
  4. 第一天|797.所有可能的路径 200. 岛屿数量

    2024-04-22 08:02:02       41 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-22 08:02:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-22 08:02:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-22 08:02:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-22 08:02:02       20 阅读

热门阅读

  1. TypeScript中什么是类类型接口?

    2024-04-22 08:02:02       15 阅读
  2. conda离线状态安装环境:更快安装环境的方式

    2024-04-22 08:02:02       13 阅读
  3. MySQL数据库——17.正则表达式

    2024-04-22 08:02:02       15 阅读
  4. 在ts中const和readonly区别?

    2024-04-22 08:02:02       14 阅读
  5. 课时101:正则表达式_基础实践_字符匹配

    2024-04-22 08:02:02       17 阅读
  6. 数据结构-排序

    2024-04-22 08:02:02       14 阅读
  7. 身份证实名接口和身份证OCR接口的组合使用

    2024-04-22 08:02:02       17 阅读
  8. 商用无线通信:信道带宽

    2024-04-22 08:02:02       13 阅读