【LeetCode-中等题】200. 岛屿数量

文章目录

    • 题目
    • 方法一:深度优先搜索 dfs
    • 方法二:广度优先搜索 bfs
    • 方法三:(重点掌握)并查集

题目

在这里插入图片描述

方法一:深度优先搜索 dfs

思路:让一个扫描指针扫描每一个格子,然后每扫到一个为1的格子,道与数量count+1,,并且对这个格子进行dfs(四个方向dfs)将此次格子的dfs周边的格子全部置为0,接着指针继续扫描下一个为1的格子,重复上面的动作。
在这里插入图片描述

扫描整个二维网格。如果一个位置为 1,则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的 1 都会被重新标记为 0。
最终岛屿的数量就是我们进行深度优先搜索的次数。

图的dfs遍历框架思路:岛屿类问题的通用解法、DFS 遍历框架

//方法一 深度优先搜索 dfsint row = 0; //网格行数 全局变量int col = 0; //网格列数 全局变量public int numIslands(char[][] grid) {if(grid[0].length==0) return 0;this.row = grid.length;//给行列全局变量赋值this.col = grid[0].length;int count = 0;//岛屿计数for(int r = 0;r<row ;r++)//遍历网格每一个各格子for(int c = 0;c<col ;c++){if(grid[r][c]=='1'){//如果网格数字为1,说明存在岛屿  count++;dfs(grid,r,c);//对该格子进行dfs  将这个格子旁边的1统统置为0}}return count;}// dfspublic void dfs(char[][] grid ,int r,int c){if(r>=row || c>=col || r<0 || c<0 || grid[r][c]=='0'){ //递归终止条件return;}grid[r][c] ='0';// 将1全部置为0 //对四个方向进行递归dfs(grid,r-1,c);dfs(grid,r+1,c);dfs(grid,r,c+1);dfs(grid,r,c-1);}

方法二:广度优先搜索 bfs

思路:
当遍历指针指向了一个1的网格,count++,就率先将该位置的绝对坐标(行*总列数+列)存入队列中,然后将该位置设置为0,接着进行while循环,从队列取出绝对位置,转换为x y坐标,然后根据x y 坐标 去判断当前位置的上下左右是否有1,是的话,就加入队列,并且置为0,直到循环结束(while循环做的事,就是在判断从对列拿出的位置周围四个方向是否有1,有就全部置为0,持续处理队列弹出的元素)

然后继续移动指针到下一个1的位置,继续前面的步骤

在这里插入图片描述
因为队列只能存一个整数,所以只能先存绝对位置,到时候弹出这个绝对位置的值,转换为行列就可以了
绝对位置:(举例 1,2 位置)
绝对位置 = 1*列数(3)+2 = 5
解析绝对位置:
行: 5 /列数 (3)= 1
列: 5%列数(3)= 2

在这里插入图片描述

扫描整个二维网格。如果一个位置为 1,则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的 1 都会被重新标记为 0。
最终岛屿的数量就是我们进行深度优先搜索的次数。

// 方法二 广度优先搜索 bfs int row = 0; //网格行数 全局变量int col = 0; //网格列数 全局变量public int numIslands(char[][] grid) {if(grid == null||grid[0].length==0) return 0;this.row = grid.length;//给行列全局变量赋值this.col = grid[0].length;int count = 0;Queue<Integer> queue = new LinkedList<>();for(int r = 0 ; r<row ; r++)for(int c = 0 ; c<col ; c++){if(grid[r][c]=='1'){// 说明有岛屿count++;//将当前位置的x和y坐标入队  直接存入整数绝对位置queue.offer(r*col+c);  //第r行  第c列grid[r][c]='0';//然后置为0while(!queue.isEmpty()){//如果队列不为空 说明其中有包含1 的元素int mid = queue.poll();  //取出该元素的绝对坐标//将该元素绝对坐标转换为  对应的x 和 y坐标int x = mid / col;//行int y = mid % col;//列//对该元素四个方向判断是否有1,是就将对应绝对坐标加入到队列,并且将该位置置为0//上if(y-1 >=0 && grid[x][y-1]=='1'){queue.offer(x*col +y-1);grid[x][y-1]='0';}//下if(y+1 < col && grid[x][y+1]=='1'){queue.offer(x*col +y+1);grid[x][y+1]='0';}//左if(x-1 >=0 && grid[x-1][y]=='1'){queue.offer((x-1)*col +y);grid[x-1][y]='0';}//右if(x+1 <row && grid[x+1][y]=='1'){queue.offer((x+1)*col +y);grid[x+1][y]='0';}}}}return count;}

方法三:(重点掌握)并查集

方法三 并查集 关键在于find方法找祖先 然后union方法同化不是相同祖先的两个临近格子(只需要比较下 和右两个方向) 以及将二维数组,以行坐标*列数+列坐标 = 祖先 的方式转为一维数组 方便进行找祖先 同化祖先,

岛屿数 = 1的个数-同化次数

这题的对比方向可以只是 往右和往下对比就足够了,无需往上,往左 (往上往左都是重复动作)

在这里插入图片描述
在这里插入图片描述

 int[] p = null;//祖先数组  初始化 自己初始化祖先就是自己  长度为格子总数int res = 0 ;public int numIslands(char[][] grid) {int m = grid.length;int n = grid[0].length;p = new int[m*n];//初始化 parent 数组,记录初始岛屿数(也就是 1 的数目)for (int i = 0; i < m; i++)for(int j = 0; j < n; j++){if(grid[i][j]=='1') res++;int idx = i*n + j;p[idx] = idx;}for (int i = 0; i < m; i++)for(int j = 0; j < n; j++){int idx = i * n + j;if(grid[i][j] == '1'){//向下合并if (i+1 < m && grid[i+1][j] == '1') { //合并岛屿union(idx, (i + 1) * n + j);}//向右合并if (j+1 <n && grid[i][j+1] == '1') {union(idx, i * n + j + 1);}}}return res;}// 递归找祖先int find(int i){if (p[i] == i) return p[i];return p[i] = find(p[i]);}void union(int i, int j){if (find(i) == find(j)) return; //若祖先相同  则不做union操作  p[find(j)] = p[find(i)];//若祖先不同  ,说明之前没有同化过,则进行同化(修改被比较位置的祖先为当前待比较位置的祖先)res--;//同化一次,res(1的总数) -1}

以上三种方法这个B站的小姐姐讲的非常透彻
岛屿数量 Number of Islands—作者: 爱学习的饲养员

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

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

相关文章

基于Gin框架的HTTP接口限速实践

在当今的微服务架构和RESTful API主导的时代&#xff0c;HTTP接口在各个业务模块之间扮演着重要的角色。随着业务规模的不断扩大&#xff0c;接口的访问频率和负载也随之增加。为了确保系统的稳定性和性能&#xff0c;接口限速成了一个重要的话题。 1 接口限速的使用场景 接口…

Qt —UDP通信QUdpSocket 简介 +案例

1. UDP通信概述 UDP是无连接、不可靠、面向数据报&#xff08;datagram&#xff09;的协议&#xff0c;可以应用于对可靠性要求不高的场合。与TCP通信不同&#xff0c;UDP通信无需预先建立持久的socket连接&#xff0c;UDP每次发送数据报都需要指定目标地址和端口。 QUdpSocket…

springboot配置ym管理各种日记(log)

1&#xff1a;yml配置mybatis_plus默认日记框架 mybatis-plus:#这个作用是扫描xml文件生效可以和mapper接口文件使用&#xff0c;#如果不加这个,就无法使用xml里面的sql语句#启动类加了MapperScan是扫描指定包下mapper接口生效&#xff0c;如果不用MapperScan可以在每一个mapp…

docker常用中间件安装

文章目录 1、前言2、中间件安装2.1、mysql2.2、gitlab容器2.3、nacos2.4、redis2.5、xxljob2.6、zipkin2.7、sentinel2.8、seata2.8.1、获取镜像2.8.2、运行容器并获取配置 2.9、rockerMQ2.9.1、rockerMQ-namesrv2.9.2、rockerMQ-broker2.9.3、rockerMQ-console 2.10、jenkins2…

每日一题(链表中倒数第k个节点)

每日一题&#xff08;链表中倒数第k个节点&#xff09; 链表中倒数第k个结点_牛客网 (nowcoder.com) 思路: 如下图所示&#xff1a;此题仍然定义两个指针&#xff0c;fast指针和slow指针&#xff0c;假设链表的长度是5&#xff0c;k是3&#xff0c;那么倒数第3个节点就是值为…

【进阶篇】MySQL分库分表详解

文章目录 0. 前言1. 垂直分库分表2. 水平分库分表 1. 理解过程及实现方案问题讨论衍生出分库分表策略借助成熟组件使用分库分表阶段完成后面临的问题1. 异地多活问题2. 数据迁移问题3. 分布式事务问题4. join查询的问题 分库分表的策略实现示例 2. 参考文档 0. 前言 假设有一个…

windows笔记本远程连接如何打开任务管理器?

参考素材&#xff1a; https://jingyan.baidu.com/article/8275fc86a97f5207a03cf6cd.html https://www.anyviewer.cn/how-to/ctrl-alt-delete-remote-desktop-6540.html 网上查了很多方法&#xff0c;都说ctrlaltend可以解决这个问题。 但是笔记本键盘上没有end键。 继续查了一…

【数学建模】清风数模正课5 相关性分析

相关系数 相关性分析的关键是计算相关系数&#xff0c;在本节课中将会介绍两种常用的相关系数&#xff1a;皮尔逊相关系数&#xff08;Pearson&#xff09;和斯皮尔曼相关系数&#xff08;Spearman&#xff09;。 它们可以用来衡量两个变量间相关性的大小&#xff0c;对于不同…

Android 13 - Media框架(9)- NuPlayer::Decoder

这一节我们将了解 NuPlayer::Decoder&#xff0c;学习如何将 MediaCodec wrap 成一个强大的 Decoder。这一节会提前讲到 MediaCodec 相关的内容&#xff0c;如果看不大懂可以先跳过此篇。原先觉得 Decoder 部分简单&#xff0c;越读越发现自己的无知&#xff0c;Android 源码真…

安卓 tcp 客户端

安卓 tcp 客户端 Server:8888 是Qt 写的Tcp 服务器 ip 是 192.168.2.103 port是8888 安卓手机运行 kotlin 语法的Tcp Client &#xff0c;连接&#xff0c;收发数据 效果如下图 Tcpclient package com.example.myapplicationimport android.os.Handler import android.os.Loo…

Go操作各大消息队列教程(RabbitMQ、Kafka)

Go操作各大消息队列教程 1 RabbitMQ 1.1 概念 ①基本名词 当前市面上mq的产品很多&#xff0c;比如RabbitMQ、Kafka、ActiveMQ、ZeroMQ和阿里巴巴捐献给Apache的RocketMQ。甚至连redis这种NoSQL都支持MQ的功能。 Broker&#xff1a;表示消息队列服务实体Virtual Host&#x…

深入探讨梯度下降:优化机器学习的关键步骤(一)

文章目录 &#x1f340;引言&#x1f340;什么是梯度下降&#xff1f;&#x1f340;损失函数&#x1f340;梯度(gradient)&#x1f340;梯度下降的工作原理&#x1f340;梯度下降的变种&#x1f340;随机梯度下降&#xff08;SGD&#xff09;&#x1f340;批量梯度下降&#xf…

HTML5+CSS3+JS小实例:科技感满满的鼠标移动推开粒子特效

实例:科技感满满的鼠标移动推开粒子特效 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport&qu…

回归拟合 | 灰狼算法优化核极限学习机(GWO-KELM)MATLAB实现

这周有粉丝私信想让我出一期GWO-KELM的文章&#xff0c;因此乘着今天休息就更新了(希望不算晚) 作者在前面的文章中介绍了ELM和KELM的原理及其实现&#xff0c;ELM具有训练速度快、复杂度低、克服了传统梯度算法的局部极小、过拟合和学习率的选择不合适等优点&#xff0c;而KEL…

HFSS 3维曲线导入

HFSS 3维曲线导入 简介环境参考代码使用结果 简介 如图一所示&#xff0c;CST中可以通过导入和到出由任意点组成的曲线&#xff0c;但是HFSS中貌似不能导入&#xff08;如图二所示&#xff09;&#xff0c;如果我们要将matlab的产生的曲线的点的数据导入特变麻烦&#xff0c;特…

测试验证平台

测试验证平台 1.功能说明&#xff1a; 模拟智能终端车端数据采集及上报的功能&#xff0c;提供数据管理平台的模拟和验证功能。 2.系统组成&#xff1a; 系统示意图 功能要求&#xff1a; 本地电脑实现Imx6配置功能&#xff0c;能够通过运行不同的脚本&#xff0c;模拟不…

大规模网络爬虫系统架构设计 - 云计算和Docker部署

在大规模网络爬虫系统中&#xff0c;合理的架构设计和高效的部署方式是确保系统稳定性和可扩展性的关键。本文将介绍如何利用云计算和Docker技术进行大规模网络爬虫系统的架构设计和部署&#xff0c;帮助你构建高效、可靠的爬虫系统。 1、架构设计原则 在设计大规模网络爬虫系…

英码科技受邀亮相2023WAIE物联网与人工智能展,荣获行业优秀创新力产品奖!

8月28日-30日&#xff0c;2023WAIE 物联网与人工智能展在深圳福田会展中心顺利举办。英码科技受邀亮相本届展会&#xff0c;并现场重点展出了面向智慧交通、智慧校园、智慧应急、智慧园区等不同行业的创新AIoT产品、AI技术服务等内容&#xff0c;与生态伙伴积极探讨市场需求和问…

CentOS配置Java环境报错-bash: /usr/local/jdk1.8.0_381/bin/java: 无法执行二进制文件

CentOS配置Java环境后执行java -version时报错&#xff1a; -bash: /usr/local/jdk1.8.0_381/bin/java: 无法执行二进制文件原因是所使用的jdk的版本和Linux内核架构匹配不上 使用以下命令查看Linux架构&#xff1a; [rootlocalhost ~]# cat /proc/version Linux version 3.1…

vue3中右侧26个英文字母排列,点击字母,平滑到响应内容

效果图如下&#xff1a; 右侧悬浮 <!-- 右侧悬浮组件 --><div class"right-sort"><div v-for"(item, index) in list" :key"index" class"sort-item" :class"index activeIndex ? sort-item-active : " c…