LeetCode[200]岛屿数量

news2025/1/17 3:13:13

难度:中等

题目:

给你一个由 '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

  • 深度优先搜索

  • 广度优先搜索

  • 并查集

  • 数组

  • 矩阵


重点!!!解题思路

第一步:

明确解题手段
类似于此种连通性问题均能使用并查集来实现

第二步:

先计算矩阵中有多少个1,如果有两个1能连接起来,那么1的数量就减少
减完后即是岛屿数量

第三步:

如何确定岛屿?
我们只需要遍历到1的时候,看1的右面和下面是否为1即可,不需要4个方向都判断
判断2个方向,使用并查集相连即可

源码:

//并查集
class UnionFind {
    //记录每个节点的根节点
    int[] parent;
    //记录每个子集的节点数
    int[] rank;
    //记录并查集中的联通分量数量
    int count;

    public UnionFind(int n){
        count=n;
        parent=new int[n];
        for (int i=0;i<n;i++){
            parent[i]=i;
        }
        rank=new int[n];
        Arrays.fill(rank,1);
    }

    //路径压缩
    public int find(int ind){
        if (parent[ind]!=ind){
            parent[ind]=find(parent[ind]);
        }
        return parent[ind];
    }

    //按秩合并
    public void unite(int ind1,int ind2){
        int root1=find(ind1),root2=find(ind2);
        if (root1!=root2){
            if (rank[root1]<rank[root2]){
                int temp=root2;
                root2=root1;
                root1=temp;
            }
            parent[root2]=root1;
            rank[root1]+=rank[root2];
            count--;
        }
    }

    public int getCount(){
        return count;
    }
    public boolean connected(int ind1,int ind2){
        return find(ind1)==find(ind2);
    }
}
class Solution {
    public int numIslands(char[][] grid) {
        int m= grid.length;
        int n=grid[0].length;
        int count=0;
        UnionFind uf = new UnionFind(m*n);
        for (int i=0;i< m;i++){
            for (int j=0;j< n;j++){
                if (grid[i][j]=='1') count++;//每有一个1那么 count数量+1
            }
        }
        //遍历整个矩阵
        for (int i=0;i<m;i++){
            for (int j=0;j<n;j++){
                if (grid[i][j]=='1'){ //如果为1,就判断它的右面和下面是否为1
                    if (i+1<m && grid[i+1][j]=='1'){ //判断右面是否为1
                        if (!uf.connected(i*n+j,(i+1)*n+j)){ //i*n+j是矩阵位置映射在并查集数组的下标位置,(i+1)*n+j)同理
                            uf.unite(i*n+j,(i+1)*n+j);//如果这两个下标之前没连接过,那么我们将两个下标相连
                            count--;//每次相连都-1
                        }
                    }
                    if (j+1<n && grid[i][j+1]=='1'){ //判断下面是否为1,为1就相连
                        if (!uf.connected(i*n+j,i*n+(j+1))){
                            uf.unite(i*n+j,i*n+(j+1));
                            count--;
                        }
                    }
                }
            }
        }
        return count;//最后返回此时岛屿数量
    }
}

解答结果:

如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。

系列持续更新中,点个订阅吧

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

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

相关文章

5-4中央处理器-控制器的功能和工作原理

文章目录一.控制器的结构和功能二.硬布线控制器1.硬布线控制单元图2.微操作命令分析3.CPU的控制方式&#xff08;1&#xff09;同步控制方式&#xff08;2&#xff09;异步控制方式&#xff08;3&#xff09;联合控制方式4.硬布线控制单元的设计步骤&#xff08;1&#xff09;分…

qsort函数用法 + 模拟实现qsort函数

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前是C语言学习者 ✈️专栏&#xff1a;【C/C】算法 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞…

论文笔记目录(ver2.0)

1 时间序列 1.1 时间序列预测 论文名称来源主要内容论文笔记&#xff1a;DCRNN &#xff08;Diffusion Convolutional Recurrent Neural Network: Data-Driven Traffic Forecasting&#xff09;_UQI-LIUWJ的博客-CSDN博客iclr 2017使用双向扩散卷积GRU&#xff0c;建模空间和…

目标跟踪心得篇五:MOT数据集标注、TrackEval的使用、DarkLabel不能自动跟踪解决方案及如何在MMTracking上输出跟踪评测

跟踪方向的标注成本非常很大的 ,那么我们如何尽可能一次性弄好呢? 所选标注工具:DarkLabel DarkLabel是一个轻量的视频标注软件,尤其做MOT任务非常友好,其标注可以通过脚本转化为标准的目标检测数据集格式、ReID数据集格式和MOT数据集格式。 使用之前: darklabel.yml:保…

传参的理解

前言 当我们调用函数的时候&#xff0c;参数是怎么传递给被调用方的&#xff0c;有想过这个问题吗&#xff1f;传递不同大小的参数对调用方式有影响吗&#xff1f;本文将带你探究这些问题&#xff0c;阅读本文需要对函数栈帧有一定的理解&#xff0c;并了解基本的汇编指令。 …

傅一平:2022年我的私人书单

2022年过去了&#xff0c;推荐我的TOP 10 书单&#xff0c;同时附上我的一句话评语和豆瓣的评分&#xff0c;这些书代表了我学习的方向&#xff0c;包括学习方法、思考方法、数据治理、数字化转型、系统架构、职场管理、个人修养、生活态度等。TOP 1 学习究竟是什么一句话评语…

【Ajax】HTTP超文本传输协议

一、HTTP协议简介什么是通信通信&#xff0c;就是信息的传递和交换。通信三要素&#xff1a;通信的主体通信的内容通信的方式1.1 现实生活中的通信案例&#xff1a;张三要把自己考清北大学的好消息写信告诉自己的好朋友李四。其中&#xff1a;通信的主体是张三和李四&#xff1…

Linux网络:应用层之HTTP协议

文章目录一、应用层1.协议2.网络版计算器二、HTTP 协议1. URL2. HTTP 协议格式3.查看 HTTP 请求4.发送 HTTP 响应5. HTTP 的方法6. HTTP 的状态码7. HTTP 的版本8. HTTP 常见 Header9. Cookie 与 session三、HTTP 与 HTTPS一、应用层 我们程序员写的一个个解决实际问题&#x…

jvm 堆 栈中存什么?

数据类型 Java虚拟机中&#xff0c;数据类型可以分为两类&#xff1a;基本类型和引用类型。基本类型的变量保存原始值&#xff0c;即&#xff1a;他代表的 值就是数值本身&#xff1b;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用&#xff0c;而不是对象本身&…

矩阵理论复习(六)

Q代表有理数&#xff0c;即整数和小数部分有限的分数和小数部分无限循环的分数。无限不循环的小数就是无理数。所有无理数和有理数加起来就是实数集R。与实数对应的就是虚数。 数域的定义 线性空间的定义 线性空间的基和维数 子空间的定义 子空间的判别方法 最常见的…

【唐诗学习】二、初唐诗词领路人

二、初唐诗词领路人 唐朝之前的主流诗人都是在宫廷混口饭吃&#xff0c;他们整天围着皇帝转&#xff0c;写的大多是宫廷奢靡的生活&#xff0c;还会拍皇帝马屁。主流诗人受前朝影响很大&#xff0c;就这么发展到了初唐。照这个剧情发展下去&#xff0c;诗歌迟早要完蛋。 可有些…

狂神聊Git~

版本控制&#xff1a; 版本控制的概念: 它是一种在开发的过程中用于管理我们对文件&#xff0c;目录或工程等内容的修改历史&#xff0c;方便我们查看历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术 版本控制的作用: 用于管理多人协同开发项目的技术 实现跨区…

Tomcat进程占用CPU过高怎么办?

在性能优化这个主题里&#xff0c;前面我们聊过了Tomcat的内存问题和网络相关的问题&#xff0c;接下来我们看一下CPU的问题&#xff0c;CPU资源经常会成为系统性能的一个瓶颈&#xff0c;这其中的原因是多方面的&#xff0c;可能是内存泄漏导致频繁GC&#xff0c;进而引起CPU使…

Linux命令--查看发行版本/内核版本的方法

原文网址&#xff1a;Linux命令--查看发行版本/内核版本的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Linux查看发行版本和内核版本的方法。 查看发行版本 cat /etc/lsb_release 说明 这个命令适用于大部分linux发行版本&#xff08;除了redhat和centos等&#xff09; …

C 语言零基础入门教程(九)

C 函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数&#xff0c;即主函数 main() &#xff0c;所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的&#xff0c;但在逻辑上&#xff0c;…

用Zybo调试CY7C68013A核心板的Slave FIFO模式

用Zybo调试CY7C68013A核心板简介CY7C68013A核心板CY7C68013程序设计硬件连接主要代码Zybo程序设计心得简介 最近在调试CY7C68013A核心板的Slave FIFO模式时&#xff0c;因为电路板的丝印bug&#xff0c;绕了一大圈。最终不但调试成功&#xff0c;也发现了用Zybo调试其它电路板…

C语言对数组元素进行排序

在实际开发中&#xff0c;有很多场景需要我们将数组元素按照从大到小&#xff08;或者从小到大&#xff09;的顺序排列&#xff0c;这样在查阅数据时会更加直观&#xff0c;例如&#xff1a;一个保存了班级学号的数组&#xff0c;排序后更容易分区好学生和坏学生&#xff1b;一…

教练,我想学设计之禅

欢迎来到PaQiuQiu的空间 本文为【教练,我想学设计之禅】,方便大家更好的阅读! <—写在前面—> 本专栏分四部分展开,设计模式与设计原则、算法与数据结构、架构设计以及实战为王。 设计模式介绍了经典的23种设计模式,设计原则重点阐述SOLID原则; 算法与数据结构详…

Linux常用命令——slabtop命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) slabtop 实时显示内核slab内存缓存信息 补充说明 slabtop命令以实时的方式显示内核“slab”缓冲区的细节信息。 语法 slabtop(选项)选项 --delayn, -d n&#xff1a;每n秒更新一次显示的信息&#xff0c;默…

使用树莓派3B、RTL-SDR、OpenWebRX搭建无线电监测站

方案介绍&#xff1a; OpenWebRX是一个国外开源项目&#xff0c;基于Python语言编写&#xff0c;配合SDR设备使用&#xff0c;能将SDR接收软件Web化&#xff0c;通过网络实现多用户远程访问&#xff0c;无需安装任何客户端软件&#xff0c;功能非常强大&#xff0c;支持&#x…