算法(图网格)-岛屿问题-岛屿数量

news2025/2/4 21:57:16

岛屿数量

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

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

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

示例 1:

输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1
示例 2:

输入:grid = [
[“1”,“1”,“0”,“0”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“1”,“0”,“0”],
[“0”,“0”,“0”,“1”,“1”]
]
输出:3
提示:

m == grid.length
n == grid[i].length
1 <= m, n <= 300

grid[i][j] 的值为 ‘0’ 或 ‘1’
Related Topics
深度优先搜索
广度优先搜索
并查集
数组
矩阵

Java实现代码如下

package algorithm.array;

import org.junit.Test;

/**
 * numIslands
 *
 * @author allens
 * @date 2023/12/25
 */
public class NumIslands {

    public int numIslands(char[][] grid) {
        boolean flag = true;
        int count = 0;
        while (flag) {
            boolean has = false;
            for (int i = 0; i < grid.length; i++) {
                for (int j = 0; j < grid[i].length; j++) {
                    if (grid[i][j] == '1') {
                        has = true;
                        flag = recursive(grid, j, i);
                        if (flag) count ++;
                    }
                }
            }
            if (!has) break;
        }

        return count;
    }

    public boolean recursive (char[][] grid, int x, int y) {

        if (y >= grid.length || y < 0) return false;
        if (x >= grid[0].length || x < 0) return false;

        // 如果这个格子不是岛屿,直接返回
        if (grid[y][x] != '1') {
            return false;
        }
        grid[y][x] = '2'; // 将格子标记为「已遍历过」

        // 上
        recursive(grid, x, y - 1);
        // 下
        recursive(grid, x, y + 1);
        // 左
        recursive(grid,  x - 1, y);
        // 右
        recursive(grid,  x + 1, y);
        return true;
    }

    @Test
    public void testMain () {
        int result = numIslands(new char[][]{
                {'1', '1', '1', '1', '0'},
                {'1', '1', '0', '1', '0'},
                {'1', '1', '0', '0', '0'},
                {'0', '0', '1', '0', '1'}
        });
    }

}

网格遍历:

每一个格子都会往上下左右方向移动,但网格是有边界的,移动到边界之后要停止移动,同时移动到已经处理过后的格子的时候也停止移动。

在这里插入图片描述

比如grid[1][1]这个节点上下左右需要处理的逻辑。向上发现值为1可以继续处理,向左发现为0直接停止移动,向右向下同理。

public boolean recursive (char[][] grid, int x, int y) {

        if (y >= grid.length || y < 0) return false;
        if (x >= grid[0].length || x < 0) return false;

        // 如果这个格子不是岛屿,直接返回
        if (grid[y][x] != '1') {
            return false;
        }
        grid[y][x] = '2'; // 将格子标记为「标记已遍历过」,如果没有这段会导致无限循环

        // 上
        recursive(grid, x, y - 1);
        // 下
        recursive(grid, x, y + 1);
        // 左
        recursive(grid,  x - 1, y);
        // 右
        recursive(grid,  x + 1, y);
        return true; // 只要代码能进到这段就说明有小岛,直接返回true
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1337250.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt 中使用 MySQL 数据库保姆级教程(上)

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 在 Qt 中默认只搭载了 QSqlLite 数据库驱动&#xff0c;若要使用其他数据库需要自己下载数据库&#xff0c;并将数据库驱动加载到…

SaaS医院信息化云his系统源码带电子病历+LIS系统

一、系统概述 •采用主流成熟技术&#xff0c;软件结构简洁、代码规范易阅读&#xff0c;SaaS 应用&#xff0c;全浏览器访问前后端分离&#xff0c;多服务协同&#xff0c;服务可拆分&#xff0c;功能易扩展&#xff1b; •支持多样化灵活配置&#xff0c;提取大量公共参数&am…

VisualStudio项目中多个同名文件处理

现象 在vs2019环境中&#xff0c;现在开发一个较大的C项目&#xff0c;它的源文件在多个文件夹中组织(在文件系统上)。在其中两个文件夹中&#xff0c;有几个同名的文件。如&#xff1a; .\ConsoleApplication1\JAMGEN_CONFIG_x4_test\firls.c .\ConsoleApplication1\NoiseCo…

网工内推 | 技术支持、解决方案工程师,RHCA认证优先,带薪年假

01 天融信 招聘岗位&#xff1a;售后技术支持工程师 职责描述&#xff1a; 1.负责公司运营商态势安全项目系统远程维护与运营支持工作。 2.负责远程对态势平台、数据探针进行日常巡检&#xff0c;及时发现故障问题&#xff0c;并反馈处置。 3.负责远程支撑态势平台的功能考核&…

TwIST算法MALTLAB主程序详解

TwIST算法MALTLAB主程序详解 关于TwIST算法的具体原理可以参考&#xff1a; 链接: https://ieeexplore.ieee.org/abstract/document/4358846 链接: https://blog.csdn.net/jbb0523/article/details/52193209 该算法的MATLAB源代码&#xff1a; 链接: http://www.lx.it.pt/~bi…

C++ DAY1 作业

1.定义自己的命名空间myspace&#xff0c;并在myspace中定义一个字符串&#xff0c;并实现求字符串长度 #include <iostream>using namespace std; namespace myspace {string str;int length_fun(){getline(cin,str);int i 0;while(str[i] ! \0){i;}return i;}} using…

How to Clean Text for Machine Learning with Python

NLP 在本教程中&#xff0c;您将了解如何清理和准备文本&#xff0c;以便使用机器学习进行建模。 完成本教程后&#xff0c;您将了解&#xff1a; 如何通过开发自己的非常简单的文本清理工具开始。 如何更上一层楼并使用 NLTK 库中更复杂的方法。 在使用现代文本表示方法&am…

论文润色有用吗 神码ai

大家好&#xff0c;今天来聊聊论文润色有用吗&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文润色有用吗&#xff1f;专业软件助你提升论文质量 一、…

sheng的学习笔记-【中】【吴恩达课后测验】Course 4 -卷积神经网络 - 第二周测验

课程4_第2周_测验题 目录 第一题 1.在典型的卷积神经网络中&#xff0c;随着网络的深度增加&#xff0c;你能看到的现象是&#xff1f; A. 【  】 n H n_H nH​和 n W n_W nW​增加&#xff0c;同时 n C n_C nC​减少 B. 【  】 n H n_H nH​和 n W n_W nW​减少&#x…

【NR技术】 EN-DC移动性流程

1 概述 NR支持LTE和NR共同组网&#xff0c;UE同时连接到eNB和gNB&#xff0c;NSA组网时&#xff0c;EN-DC是一种主流连接方式。 2 EN-DC移动性处理流程 2.1 Inter-gNB-DU Mobility using MCG SRB 在EN-DC操作过程中&#xff0c;当只有MCG SRB可用时&#xff0c;UE从一个gNB-D…

【前端技术】Vite vs Webpack

✨专栏介绍 在当今数字化时代&#xff0c;Web应用程序已经成为了人们生活和工作中不可或缺的一部分。而要构建出令人印象深刻且功能强大的Web应用程序&#xff0c;就需要掌握一系列前端技术。前端技术涵盖了HTML、CSS和JavaScript等核心技术&#xff0c;以及各种框架、库和工具…

网络通信-Linux 对网络通信的实现

Linux 网络 IO 模型 同步和异步&#xff0c;阻塞和非阻塞 同步和异步 关注的是调用方是否主动获取结果 同步:同步的意思就是调用方需要主动等待结果的返回 异步:异步的意思就是不需要主动等待结果的返回&#xff0c;而是通过其他手段比如&#xff0c;状态通知&#xff0…

CNVD原创漏洞审核和处理流程

一、CNVD原创漏洞审核归档和发布主流程 &#xff08;一&#xff09;审核和归档流程 审核流程分为一级、二级、三级审核&#xff0c;其中一级审核主要对提交的漏洞信息完整性进行审核&#xff0c;漏洞符合可验证&#xff08;通用型漏洞有验证代码信息或多个互联网实例、事件型…

Java之遍历树状菜单

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;无 &#x1f33c…

Android studio 使用greenDao根据实体类生成dao类

1.遇到的问题 使用android studio根据实体类生成dao其实也很简单&#xff0c;你只要实现 Parcelable Entity public class ConfigDataModel implements Parcelable {Id(autoincrement true)private Long id null; } 2.使用自带的方法生成 使用build-->make Project生成 …

软件体系结构复习

复习参考&#xff1a; 一文搞懂什么是RESTful API 九种常见UML图 企业级软件开发的基本概念 软件架构&#xff1a;在设计和构建软件系统时采用的基本结构和原则。 它涉及到对软件系统进行模块化、组织和分解的方式&#xff0c;以及不同模块之间的交互和通信方式。在软件设计中…

pyomo使用cplex求解,进行冲突校验

文章目录 求解参数设置模型保存模型冲突校验pyomo冲突校验cplex冲突校验docplex冲突校验 CPLEX 安装包下载 pyomo使用 cplex求解&#xff0c;进行冲突校验 求解参数设置 options {"timelimit" : 60*60, # 设置求解时间&#xff0c;超过设置时间&#xff0c;求解停…

短视频矩阵系统的崛起和影响

近年来&#xff0c;短视频矩阵系统已经成为了社交媒体中的一股新势力。这个新兴的社交媒体形式以其独特的魅力和吸引力&#xff0c;迅速吸引了大量的用户。这个系统简单来说就是将海量短视频整合在一个平台上&#xff0c;使用户可以方便地观看和分享好玩有趣的短视频。 短视频…

巨大成就背后,我揭开比亚迪销量第一秘密

可以说比亚迪已经成为我每日注视的焦点所在&#xff0c;无论数据走势还是旗下各品牌新车动向&#xff0c;我都抱着浓厚兴趣细细研究。 今天&#xff0c;当我读到比亚迪再次蝉联新能源车销量王座的消息时&#xff0c;我不禁为之振奋。这家在新能源车业风生水起的企业&#xf…