【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.rhkb.cn/news/116859.html

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

相关文章

3D路径,控件

主要分3大块&#xff1a; 1控制面板 vc:VisuStruct3DControl; // 用于绑定3d轨迹控件的按钮2轨迹图&#xff1a;【整体图】 SM3_CNC_Visu.SMC_PathCopierCompleteQueue; //坐标流轨迹图 SM3_CNC_Visu.SMC_PathCopierFile; //文本轨迹图 SMC_PositionTracker (FB) /…

NetSuite海鲜书 - 知识会汇编 用户篇 2023

NetSuite2021年初夏&#xff0c;NetSuite知识会成立。它由本人&#xff0c;上海德之匠信息技术有限公司的毛岩喆&#xff08;江湖人称Rick&#xff09;发起建立。建立的初衷秉承Rick个人博客“学问思辨&#xff0c;企业信息化路上的行者”的理念&#xff0c;期望能够在NetSuite…

c++(8.29)auto关键字,lambda表达式,数据类型转换,标准模板库,list,文件操作+Xmind

作业&#xff1a; 封装一个学生的类&#xff0c;定义一个学生这样类的vector容器, 里面存放学生对象&#xff08;至少3个&#xff09; 再把该容器中的对象&#xff0c;保存到文件中。 再把这些学生从文件中读取出来&#xff0c;放入另一个容器中并且遍历输出该容器里的学生。…

Apifox(1)比postman更优秀的接口自动化测试平台

Apifox介绍 Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台&#xff0c;定位 Postman Swagger Mock JMeter。通过一套系统、一份数据&#xff0c;解决多个系统之间的数据同步问题。只要定义好 API 文档&#xff0c;API 调试、API 数据 Mock、API 自…

睿趣科技:开抖音小店挣钱吗到底

在当今数字化时代&#xff0c;社交媒体平台成为了创业者们寻找商机和赚钱的新途径。而抖音作为一款风靡全球的短视频分享平台&#xff0c;自然也成为了许多人开设小店、进行创业的选择之一。那么&#xff0c;开抖音小店能否真正实现盈利&#xff0c;成为了一个备受关注的话题。…

Windows开发调试纯Linux代码(WSL+Qt+MobaXterm)环境搭建(超详细教程)

为何要调试Linux代码 1 学习Linux环境开发 想必很多同学都想学习Linux环境下的开发&#xff0c;一个是很多纯服务端程序不需要Windows这样的窗口界面。另一个纯服务端开发Linux的命令行以及脚本优势也比较明显。相反&#xff0c;Windows在纯服务端编程方面并没有Linux有优势。…

java内存模型讨论及案例分析

常用内存选项 -Xmx&#xff1a; 最大堆大小 -Xms&#xff1a;最小堆大小 -Xss &#xff1a;线程堆栈大小&#xff0c;默认1M 生产环境最好保持 Xms Xmx java内存研究 内存布局 可见&#xff1a; 堆大小 新生代 老年代&#xff0c;新生代EFrom SurvivorTo Survivor。新…

Maven入门教程(三):Maven语法

视频教程&#xff1a;Maven保姆级教程 Maven入门教程(一)&#xff1a;安装Maven环境 Maven入门教程(二)&#xff1a;idea/Eclipse使用Maven Maven入门教程(三)&#xff1a;Maven语法 Maven入门教程(四)&#xff1a;Nexus私服 Maven入门教程(五)&#xff1a;自定义脚手架 6.Mav…

【vue】this.$nextTick解决this.$refs undefined的问题

说明 1、发邮件页面分成两个部分&#xff1a;模态框页面&#xff08;头部和底部&#xff09;和form页面&#xff08;操作按钮&#xff09; 2、点击回复按钮&#xff0c;要将发件人信息带到模态框页面&#xff0c;给定默认值且禁止收件人下拉选择&#xff08;多个邮箱&#xff…

数据库(MySQL)的存储过程

一、存储过程介绍 存储过程是事先经过编译并存储在数据库中的一段SQL 语句的集合&#xff0c;调用存储过程可以简化应用开发人员的很多工作&#xff0c;减少数据在数据库和应用服务器之间的传输&#xff0c;对于提高数据处理的效率是有好处的。 存储过程思想上很简单&#xff0…

基于白鲸算法优化的BP神经网络(预测应用) - 附代码

基于白鲸算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于白鲸算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.白鲸优化BP神经网络2.1 BP神经网络参数设置2.2 白鲸算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

探索在云原生环境中构建的大数据驱动的智能应用程序的成功案例,并分析它们的关键要素。

文章目录 1. Netflix - 个性化推荐引擎2. Uber - 实时数据分析和决策支持3. Airbnb - 价格预测和优化5. Google - 自然语言处理和搜索优化 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专…

Leetcode110. 平衡二叉树

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 题解&#xff…

工控上位机程序为什么只能用C语言?

工控上位机程序并不只能用C#开发&#xff0c;实际上在工业自动化领域中&#xff0c;常见的上位机开发语言包括但不限于以下几种&#xff1a;C#: C#是一种常用的编程语言&#xff0c;在工控领域中被广泛使用。它具有良好的面向对象特性和丰富的类库支持&#xff0c;可以实现高性…

MySQL - 函数

1 什么是函数&#xff1f; 要想实现上面的这些效果&#xff0c;就得借助于MySQL当中的内置函数。 函数&#xff1a;是指一段可以直接被另一段程序调用的程序或代码。 MySQL当中内置了很多的函数&#xff0c;根据其操作的数据类型&#xff0c;分为以下四类&#xff1a; 字符串…

pdf转换成图片免费软件用哪个?pdf转换成图片就用它

随着技术的发展&#xff0c;现在企业办公运用到的电子文档各种各样&#xff0c;我们日常需要掌握的技能越来越高要求&#xff0c;其中pdf和图片是我们经常接触的文件格式之一&#xff0c;而且这两个文件格式我们会经常将它们进行转换&#xff0c;那么pdf转换成图片怎么操作呢?…

六、Kafka-Eagle监控

目录 6.1 MySQL 环境准备6.2 Kafka 环境准备6.3 Kafka-Eagle 安装 6.1 MySQL 环境准备 Kafka-Eagle 的安装依赖于 MySQL&#xff0c;MySQL 主要用来存储可视化展示的数据 6.2 Kafka 环境准备 修改/opt/module/kafka/bin/kafka-server-start.sh 命令 vim bin/kafka-server-sta…

鸿蒙系列-如何使用好 ArkUI 的 @Reusable?

如何使用好 ArkUI 的 Reusable&#xff1f; OpenHarmony 组件复用机制 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为 系统组件&#xff0c;由开发者定义的称为 自定义组件。 在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合…

网站搭建最简化的引导操作 | 云服务器的购买选用 | 域名的选用 | 网站的上线和备案。

本文章面向对象为网站搭建的初次操作者&#xff0c;主要是一些自主使用的网站&#xff0c;为小白做为引导的教程。 一&#xff0c; 网站搭建的流程 1&#xff0c;服务器的租赁 2&#xff0c;购买域名 3&#xff0c;对域名进行备案 4&#xff0c;网站内部的搭建&#xff0c;上线…

音视频开发常用工具

文章目录 前言一、VLC 播放器1、简介2、下载3、VLC media player4、VLC 打开网络串流5、VLC 作为流媒体服务器①、搭建 RTSP 流媒体服务器②、新建播放器 二、MediaInfo1、简介2、下载3、MediaInfo①、主界面②、主要功能特点③、使用方法④、Mediainfo 相关参数和含义简介 三、…