码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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(深度优先搜索)来识别和计数所有的岛屿。每当找到一个未被访问的陆地单元格,就通过递归“感染”过程标记所有与之相连的陆地单元格,防止它们在后续的遍历中被重复计数。这种方法简单高效地解决了岛屿计数问题。

    代码如下:

    1. public static int numIslands(char[][] m) {
    2. if (m == null || m.length == 0 || m[0] == null || m[0].length == 0) {
    3. return 0;
    4. }
    5. int N = m.length;
    6. int M = m[0].length;
    7. int res = 0;
    8. for (int i = 0; i < N; i++) {
    9. for (int j = 0; j < M; j++) {
    10. if (m[i][j] == '1') {
    11. res++;
    12. infect(m, i, j, N, M);
    13. }
    14. }
    15. }
    16. return res;
    17. }
    18. public static void infect(char[][] m, int i, int j, int N, int M) {
    19. if (i < 0 || i >= N || j < 0 || j >= M || m[i][j] != '1') {
    20. return;
    21. }
    22. m[i][j] = '2';
    23. infect(m, i + 1, j, N, M);
    24. infect(m, i - 1, j, N, M);
    25. infect(m, i, j + 1, N, M);
    26. infect(m, i, j - 1, N, M);
    27. }

     

  • 相关阅读:
    使用realsense D435i实现机械臂对物体的自动抓取总结
    员工离职困扰?来看AI如何解决,基于人力资源分析的 ML 模型构建全方案 ⛵
    解读数仓中的数据对象及相关关系
    论硬件开发过程中开发文档规范化的重要性
    【小月电子】国产安路FPGA开发板系统学习教程-LESSON9简易测试系统
    招行零售金融3.0数字化转型实践
    社交革命的引领者:探索Facebook如何改变我们的生活方式
    ChatGLM:向量化构建本地知识库原理
    springboot+企业财务发票管理系统 毕业设计-附源码231105
    C++栈、队列、优先级队列模拟+仿函数
  • 原文地址:https://blog.csdn.net/qq_29434541/article/details/138041712
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号