当前位置: 首页 > news >正文

力扣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思路&#xff1a; 首先通过两层for循环遍历每一个点&#xff0c;如果这个点为0或者2&#xff08;这个2是什么呢&#xff1f;是在遍历该点以及该点连成的这一片区域中&#xff0c;因为通过深度优先搜索&#xff0c;遍历该点就等于遍历这一片区域&#xff0c;遍历这篇区域中的…...

如何在Linux使用docker安装Plik并实现无公网ip上传下载内网存储的文件资源

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&…...

Nginx反向代理详解

1. 什么是反向代理 反向代理是一种服务器代理的方式&#xff0c;它代理了客户端的请求并将请求转发给后端服务器&#xff0c;然后将后端服务器的响应返回给客户端。在这个过程中&#xff0c;客户端并不直接与后端服务器通信&#xff0c;而是通过反向代理服务器来实现请求转发和…...

【Android】 ClassLoader 知识点提炼

1.Java中的 ClassLoader 1.1 、ClassLoader的类型 Java 中的类加载器主要有两种类型&#xff0c;即系统类加载器和自定义类加载器。其中系统类 加载器包括3种&#xff0c;分别是 Bootstrap ClassLoader、Extensions ClassLoader 和 Application ClassLoader。 1.1.1.Bootstra…...

16. C++标准库

C标准库兼容C语言标准函数库&#xff0c;可以在C标准库中直接使用C语言标准函数库文件&#xff0c;同时C标准库增加了自己的源代码文件&#xff0c;新增文件使用C编写&#xff0c;多数代码放在std命名空间中&#xff0c;所以连接C标准库文件后还需要 using namespace std;。 【…...

JVM内存结构介绍

1. 什么是JVM 我们都知道在 Windows 系统上一个软件包装包是 exe 后缀的&#xff0c;而这个软件包在苹果的 Mac OSX 系统上是无法安装的。类似地&#xff0c;Mac OSX 系统上软件安装包则是 dmg 后缀&#xff0c;同样无法在 Windows 系统上安装。 Java 代码为什么可以在 Windows…...

Linux常见指令总结

ls&#xff1a;显示当前目录下文件列表 常用的命令行参数&#xff1a; -l 显示更多的文件属性 -a 显示所有的文件/目录&#xff08;包括隐藏的&#xff09; -d 只显示目录 ps&#xff1a;参数可以叠加使用。 例如&#xff1a;ls -la 显示所有文件…...

Day35-Linux网络管理5

Day35-Linux网络管理5 1. 网卡配置2. DNS客户端域名解析配置3. 给网卡配多个IP4. ip地址查看和设置4.1 ifconfig命令4.2 ip命令4.3 ip命令&#xff1a;查看和设置网络配置4.4 ip命令帮助 5. 路由5.1 路由功能分类&#xff1a;5.2 查看路由&#xff1a;5.3 路由表&#xff1a;5.…...

9个神奇免费AI编程助手,实现高效自动代码生成!

在AIGC技术工具快速发展的时代&#xff0c;对高效智能编程工具的需求和关注已达到空前的高度。本文将介绍9款免费且好用的AI编程助手工具。无论你是经验丰富的开发人员还是刚开始编程旅程的新手&#xff0c;这些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优化索引基本思路遇到的问题&#xff08;学到的东西&#xff09;感悟完整代码 2022–09-3 防疫大数据 STL大模拟 使用map优化索引 这题中规中矩&#xff0c;不算太难也不算太简单&am…...

【Linux基础(三)】信号

学习分享 1、信号的基本概念2、查看信号列表3、常见信号名称4、signal库函数5、发送信号kill6、kill - signal &#xff08;无参信号&#xff09;示例6.1、kill - signal (不可靠信号)示例6.2、kill - signal (可靠信号)示例 7、信号分类7.1、信号运行原理分类7.2、信号是否携带…...

GEE图像可视化常用函数

目录 图层操作Map.addLayer&#xff08;&#xff09;Map.centerObject&#xff08;&#xff09; 直方图ui.Chart.image.histogram&#xff08;&#xff09; 时间序列统计ui.Chart.image.series&#xff08;&#xff09;ui.Chart.image.seriesByRegion&#xff08;&#xff09; …...

c++基础语法

文章目录 前言命名空间命名空间的使用 缺省参数缺省参数的使用 函数重载函数重载的作用函数重载的使用函数重载原理 引用引用的使用引用的使用场景引用和指针 extern Cinlineauto范围fornullptr 前言 大家好我是jiantaoyab&#xff0c;这篇文章给大家带来的是c语言没有的一些特…...

【工作实践-07】uniapp关于单位rpx坑

问题&#xff1a;在浏览器页面退出登录按钮上“退出登录”字样消失&#xff0c;而在手机端页面正常;通过查看浏览器页面的HTML代码&#xff0c;发现有“退出登录”这几个字&#xff0c;只不过由于样式问题&#xff0c;这几个字被挤到看不见了。 样式代码中有一行为&#xff1a…...

服务层组件

目录 连接层(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 用户行为分析&#xff08;UEBA&#xff09; 现代化的用户行为分析产品具有多种优势功能&#xff0c;使企业能够有效地检测内部威胁。用户行为分析软件通过收集和分析来自各种来源的数据来分析和检测内部人员的可疑行为。这些来源包括网络日志和用户活动日志。通过检查这些数…...

内网渗透-跨域环境渗透-1

目录 smbclient工具 mimikatz工具 Kerbers协议 NTLM认证 hash传递攻击&#xff08;PTH攻击&#xff09; 黄金票据攻击 白银票据 MS14-068 smbclient工具 在linux里面连接远程windows共享目录&#xff0c;可以使用这个工具 ​ 第一种连接方式&#xff1a;smbclient -L 目…...

安信可IDE(AiThinker_IDE)编译ESP8266工程方法

0 工具准备 AiThinker_IDE.exe ESP8266工程源码 1 安信可IDE&#xff08;AiThinker_IDE&#xff09;编译ESP8266工程方法 1.1 解压ESP8266工程文件夹 我们这里使用的是NON-OS_SDK&#xff0c;将NON-OS_SDK中的1_UART文件夹解压到工作目录即可 我这里解压到了桌面&#xff0c…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...