力扣hot---岛屿数量

dfs思路:
首先通过两层for循环遍历每一个点,如果这个点为0或者2(这个2是什么呢?是在遍历该点以及该点连成的这一片区域中,因为通过深度优先搜索,遍历该点就等于遍历这一片区域,遍历这篇区域中的点的同时,将这些元素标记为2,即代表这篇区域已经遍历过),那么遍历下一个点。遇到一个新的区域则cnt++。
那么怎么进行深度搜索呢?即如果该点=1,那么将该点的上方、下方、左方、右方送入dfs。
dfs代码:
C++:
class Solution {
public:int p_m[4]={-1,1,0,0};int p_n[4]={0,0,-1,1};void dfs(vector<vector<char>>& grid,int i,int j,int m,int n){for(int k=0;k<4;k++){int x=i+p_m[k];int y=j+p_n[k];if(x>=0 && x<m && y>=0 && y<n){if(grid[x][y]=='0'||grid[x][y]=='2'){continue;}else{grid[x][y]='2';dfs(grid,x,y,m,n);}}}}int numIslands(vector<vector<char>>& grid) {int m=grid.size();int n=grid[0].size();//cout<<m<<' '<<n<<endl;int cnt=0;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]=='2'||grid[i][j]=='0'){continue;}else{dfs(grid,i,j,m,n);cnt++;}}}return cnt;}
};
注意:二维数组中,求行数为
int m=grid.size();
求列数为
int n=grid[0].size();
python:
class Solution:def dfs(self,grid:List[list[str]],i:int,j:int,m:int,n:int) -> int:p_m=[-1,1,0,0]p_n=[0,0,-1,1]for k in range(4):x=i+p_m[k]y=j+p_n[k]if x>=0 and x<m and y>=0 and y<n:if grid[x][y]=='0' or grid[x][y]=='2':continueelse:grid[x][y]='2'self.dfs(grid,x,y,m,n)def numIslands(self, grid: List[List[str]]) -> int:m=len(grid)n=len(grid[0])cnt=0for i in range(m):for j in range(n):if grid[i][j]=='2' or grid[i][j]=='0':continue;else:self.dfs(grid,i,j,m,n)cnt+=1return cnt
bfs思路:
与dfs类似,遍历每个元素时,如果该元素的值为1,那么将其入队列,并且考虑其上下左右的元素,如果周围元素值为1,将其也入队列。遍历一个元素时,如果该值为1,那么代表访问了一个新的区域,则cnt++。
代码:
C++:
class Solution {
public:deque<pair<int,int>> q;int p_x[4]={-1,1,0,0};int p_y[4]={0,0,1,-1};int numIslands(vector<vector<char>>& grid) {int cnt=0;int m=grid.size();int n=grid[0].size();for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]=='0'||grid[i][j]=='2'){continue;}else{cnt++;}q.push_back({i,j});while(!q.empty()){pair<int,int> temp=q.front();q.pop_front();int temp_x=temp.first;int temp_y=temp.second;if(grid[temp_x][temp_y]=='0'||grid[temp_x][temp_y]=='2'){continue;}else{grid[temp_x][temp_y]='2';for(int k=0;k<4;k++){int x=temp_x+p_x[k];int y=temp_y+p_y[k];if(x>=0 && x<m && y>=0 && y<n){if(grid[x][y]=='0'||grid[x][y]=='2'){continue;}else{q.push_back({x,y});}}}}}}}return cnt;}
};
明显可以看到bfs要比dfs慢的多。

python:
class Solution:def numIslands(self, grid: List[List[str]]) -> int:q=deque()p_x=[-1,1,0,0]p_y=[0,0,1,-1]cnt=0m=len(grid)n=len(grid[0])for i in range(m):for j in range(n):if grid[i][j]=='0' or grid[i][j]=='2':continueelse:cnt+=1q.append((i,j))while q:temp=q[0]q.popleft()temp_x=temp[0]temp_y=temp[1]if grid[temp_x][temp_y]=='0' or grid[temp_x][temp_y]=='2':continueelse:grid[temp_x][temp_y]='2'for k in range(4):x=temp_x+p_x[k]y=temp_y+p_y[k]if x>=0 and x<m and y>=0 and y<n:if grid[x][y]=='0' or grid[x][y]=='2':continueelse:q.append((x,y))return cnt
注意:C++中的pair<int,int>用python中的tuple来代替
q.append((i,j))
同时,记得添加from collections import deque
并查集思路:
遍历所有元素,如果该元素为‘0’,则跳过;如果该元素为‘1’,cnt++(岛屿数++,后面再依次向下减),同时为其分配一个Father结点,值为其本身,但是本身是(i,j),该怎么存到Father数组中呢?用二维数组转换成一维数组的方法,即将(i,j)转换为(i*n+j)【相当于以行优先,看是第几个元素】。接下来,依次判断上下左右值,如果为1,就和自己合并。这里分为真合并和假合并,假合并就是这两个值原来就合并过。如果是真合并,则进行cnt--的操作。
并查集代码:
C++:
class Solution {
public:int p_x[4]={-1,1,0,0};int p_y[4]={0,0,-1,1};int cnt=0;int find(vector<int>& Father,int x){if(Father[x]==x){return x;}Father[x]=find(Father,Father[x]);return Father[x];}void Union(vector<int>& Father,int x,int y){int Fx=find(Father,x);int Fy=find(Father,y);if(Fx==Fy){return;}Father[Fy]=Fx;cnt--;}int numIslands(vector<vector<char>>& grid) {int m=grid.size();int n=grid[0].size();vector<int> Father(m*n,0);//初始化Father数组for(int i=0;i<m;i++){for(int j=0;j<n;j++){int temp=n*i+j;if(grid[i][j]=='1'){Father[temp]=temp;cnt++;}else{Father[temp]=-1;}}}//Unionfor(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]=='0'){continue;}for(int k=0;k<4;k++){int x=i+p_x[k];int y=j+p_y[k];if(x>=0 && x<m && y>=0 && y<n){if(grid[x][y]=='0'){continue;}else{int a=i*n+j;int b=x*n+y;Union(Father,a,b);}}}}}return cnt;}
};
Python:
class Solution:def find(self,Father:List[int],x:int) -> int:if Father[x]==x:return xFather[x]=self.find(Father,Father[x])return Father[x]def Union(self,Father:List[int],x:int,y:int,cnt:int) ->int:Fx=self.find(Father,x)Fy=self.find(Father,y)if Fx==Fy:return cntFather[Fy]=Fxcnt-=1return cntdef numIslands(self, grid: List[List[str]]) -> int:p_x=[-1,1,0,0]p_y=[0,0,-1,1]m=len(grid)n=len(grid[0])Father=[0]*(m*n)cnt=0for i in range(m):for j in range(n):temp=n*i+jif grid[i][j]=='1':Father[temp]=tempcnt+=1else:Father[temp]=-1for i in range(m):for j in range(n):if grid[i][j]=='0':continuefor k in range(4):x=i+p_x[k]y=j+p_y[k]if x>=0 and x<m and y>=0 and y<n:if grid[x][y]=='0':continueelse:a=i*n+jb=x*n+ycnt=self.Union(Father,a,b,cnt)return cnt
注意类中函数第一个参数为self
相关文章:
力扣hot---岛屿数量
dfs思路: 首先通过两层for循环遍历每一个点,如果这个点为0或者2(这个2是什么呢?是在遍历该点以及该点连成的这一片区域中,因为通过深度优先搜索,遍历该点就等于遍历这一片区域,遍历这篇区域中的…...
如何在Linux使用docker安装Plik并实现无公网ip上传下载内网存储的文件资源
文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默&…...
Nginx反向代理详解
1. 什么是反向代理 反向代理是一种服务器代理的方式,它代理了客户端的请求并将请求转发给后端服务器,然后将后端服务器的响应返回给客户端。在这个过程中,客户端并不直接与后端服务器通信,而是通过反向代理服务器来实现请求转发和…...
【Android】 ClassLoader 知识点提炼
1.Java中的 ClassLoader 1.1 、ClassLoader的类型 Java 中的类加载器主要有两种类型,即系统类加载器和自定义类加载器。其中系统类 加载器包括3种,分别是 Bootstrap ClassLoader、Extensions ClassLoader 和 Application ClassLoader。 1.1.1.Bootstra…...
16. C++标准库
C标准库兼容C语言标准函数库,可以在C标准库中直接使用C语言标准函数库文件,同时C标准库增加了自己的源代码文件,新增文件使用C编写,多数代码放在std命名空间中,所以连接C标准库文件后还需要 using namespace std;。 【…...
JVM内存结构介绍
1. 什么是JVM 我们都知道在 Windows 系统上一个软件包装包是 exe 后缀的,而这个软件包在苹果的 Mac OSX 系统上是无法安装的。类似地,Mac OSX 系统上软件安装包则是 dmg 后缀,同样无法在 Windows 系统上安装。 Java 代码为什么可以在 Windows…...
Linux常见指令总结
ls:显示当前目录下文件列表 常用的命令行参数: -l 显示更多的文件属性 -a 显示所有的文件/目录(包括隐藏的) -d 只显示目录 ps:参数可以叠加使用。 例如:ls -la 显示所有文件…...
Day35-Linux网络管理5
Day35-Linux网络管理5 1. 网卡配置2. DNS客户端域名解析配置3. 给网卡配多个IP4. ip地址查看和设置4.1 ifconfig命令4.2 ip命令4.3 ip命令:查看和设置网络配置4.4 ip命令帮助 5. 路由5.1 路由功能分类:5.2 查看路由:5.3 路由表:5.…...
9个神奇免费AI编程助手,实现高效自动代码生成!
在AIGC技术工具快速发展的时代,对高效智能编程工具的需求和关注已达到空前的高度。本文将介绍9款免费且好用的AI编程助手工具。无论你是经验丰富的开发人员还是刚开始编程旅程的新手,这些AI代码软件都能帮助你提高项目开发的生产力、创造力和准确性&…...
Python 导入Excel三维坐标数据 生成三维曲面地形图(体) 5-3、线条平滑曲面且可通过面观察柱体变化(三)
环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…...
【CSP】2022–09-3 防疫大数据 100分 STL大模拟 使用map优化索引 有坑得注意
2022–09-3 防疫大数据 STL大模拟 使用map优化索引 2022–09-3 防疫大数据 STL大模拟 使用map优化索引基本思路遇到的问题(学到的东西)感悟完整代码 2022–09-3 防疫大数据 STL大模拟 使用map优化索引 这题中规中矩,不算太难也不算太简单&am…...
【Linux基础(三)】信号
学习分享 1、信号的基本概念2、查看信号列表3、常见信号名称4、signal库函数5、发送信号kill6、kill - signal (无参信号)示例6.1、kill - signal (不可靠信号)示例6.2、kill - signal (可靠信号)示例 7、信号分类7.1、信号运行原理分类7.2、信号是否携带…...
GEE图像可视化常用函数
目录 图层操作Map.addLayer()Map.centerObject() 直方图ui.Chart.image.histogram() 时间序列统计ui.Chart.image.series()ui.Chart.image.seriesByRegion() …...
c++基础语法
文章目录 前言命名空间命名空间的使用 缺省参数缺省参数的使用 函数重载函数重载的作用函数重载的使用函数重载原理 引用引用的使用引用的使用场景引用和指针 extern Cinlineauto范围fornullptr 前言 大家好我是jiantaoyab,这篇文章给大家带来的是c语言没有的一些特…...
【工作实践-07】uniapp关于单位rpx坑
问题:在浏览器页面退出登录按钮上“退出登录”字样消失,而在手机端页面正常;通过查看浏览器页面的HTML代码,发现有“退出登录”这几个字,只不过由于样式问题,这几个字被挤到看不见了。 样式代码中有一行为:…...
服务层组件
目录 连接层(Connection Pool) SQL接口(SQL Interface) 查询缓存(Caches&Buffers) Management Services&Utilities 查询分析器(Parser) 优化器(Optimizer)...
【学习笔记】VMware vSphere 6.7虚拟化入门
VMware vSphere 6.7虚拟化入门课程介绍 课程内容 1、VMware vSphere 6.7虚拟化入门课程介绍 2、ESXi6.7控制台设置 3、使用vSpkere Host client管理虚拟机 4、VMware EsXi基础操作 5、VMware Esxi存储管理 6、管理ESXi主机网络与虚拟机网络 7、安装配置vCenter Server Applia…...
如何防范企业内部安全威胁?
1 用户行为分析(UEBA) 现代化的用户行为分析产品具有多种优势功能,使企业能够有效地检测内部威胁。用户行为分析软件通过收集和分析来自各种来源的数据来分析和检测内部人员的可疑行为。这些来源包括网络日志和用户活动日志。通过检查这些数…...
内网渗透-跨域环境渗透-1
目录 smbclient工具 mimikatz工具 Kerbers协议 NTLM认证 hash传递攻击(PTH攻击) 黄金票据攻击 白银票据 MS14-068 smbclient工具 在linux里面连接远程windows共享目录,可以使用这个工具 第一种连接方式:smbclient -L 目…...
安信可IDE(AiThinker_IDE)编译ESP8266工程方法
0 工具准备 AiThinker_IDE.exe ESP8266工程源码 1 安信可IDE(AiThinker_IDE)编译ESP8266工程方法 1.1 解压ESP8266工程文件夹 我们这里使用的是NON-OS_SDK,将NON-OS_SDK中的1_UART文件夹解压到工作目录即可 我这里解压到了桌面,…...
从Office功能区的“局外人“到“掌控者“:Office RibbonX Editor深度指南
从Office功能区的"局外人"到"掌控者":Office RibbonX Editor深度指南 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/g…...
[智能体-69]:重新认知MCP:协议不生产智能,只是AI全域交互的标准化基石
MCP只是提供了大模型、编排调度、外部工具能够进行结构化交流的标准,而整个系统的智能主要依赖编排调度,与外部软件系统的交互取决于外部工具,包括外部语音交互、视觉交互、数字化交互。当下MCP(Model Context Protocol࿰…...
ThinkPad开机报错0183/0253?别慌,手把手教你搞定EFI变量错误(附BIOS重置教程)
ThinkPad开机报错0183/0253?EFI变量错误全面解决方案当你按下ThinkPad的电源键,期待熟悉的开机画面时,屏幕上却突然跳出一串神秘代码——"0183: Bad CRC of Security Settings in EFI Variable"或"0253: EFI Variable Block D…...
鸿蒙系统微博应用锁常见问题解答
为微博设置应用锁后,不少用户会有各种疑问:忘记密码怎么办?会不会影响消息推送?能不能只锁定某些功能?应用锁耗电吗?本文将针对这些高频问题逐一解答,帮助您更好地使用鸿蒙系统(Harm…...
销售怎么通过各种方法获取电话号码
第一种就是那个用爬虫电话号码,然后再打电话给客户。第二种是在别人的挪车电话看车挪车电话,然后再打电话找客户。第三就是。扫楼一顿顿的扫,第四就是这个那种商店,一个个的去问陌拜地推一个个的问店子要不要贷款,去问…...
【DeepSeek架构评审功能深度解密】:20年架构师亲授3大避坑指南与5步落地 checklist
更多请点击: https://kaifayun.com 第一章:DeepSeek架构评审功能全景概览 DeepSeek架构评审功能是一套面向大模型系统设计与工程落地的自动化分析框架,聚焦于模型结构合理性、计算图优化潜力、内存访问模式、算子兼容性及部署约束等多维度评…...
超维计算(HDC)原理与ScalableHD架构优化实践
1. 超维计算(HDC)基础解析超维计算(Hyperdimensional Computing, HDC)是一种受大脑信息处理机制启发的计算范式,其核心思想是用高维随机向量(通常称为超向量或HV)来表示和处理信息。与传统神经网…...
武汉国电华美16875kVA串联谐振试验装置,这手活儿细
在超高压变电站和长距离电缆的现场,交流耐压试验是检验设备绝缘的“最后一关”。这位老师傅经手过不少大工程,他说,面对GIS、大型变压器这些“大块头”电容性试品,能不能顺利“过关”,往往就看串联谐振装置顶不顶得住。…...
什么情况下会核销贷款
贷款核销的核心前提是:贷款被认定为 “损失类” 且经 “穷尽追偿” 仍无法收回,银行按监管与会计规则从账面冲销,但债权不消灭、仍可追偿。一、核心认定条件(满足其一即可)破产 / 注销 / 吊销:借款人和担保…...
【DeepSeek集成测试黄金标准】:20年专家亲授5大避坑指南与自动化落地框架
更多请点击: https://intelliparadigm.com 第一章:DeepSeek集成测试黄金标准的演进与核心价值 集成测试在大语言模型工程化落地过程中已从“验证功能可用”跃迁为“保障推理一致性、上下文鲁棒性与安全边界的三位一体质量门禁”。DeepSeek系列模型&…...
