力扣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:

明天继续更啦~

前序中序遍历二叉树

并查集做该道题

bfs的python写法

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

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

相关文章

玩家至上:竞技游戏设计如何满足现代玩家的需求?

文章目录 一、现代玩家需求分析二、以玩家体验为核心的游戏设计三、个性化与定制化服务四、强化社交互动与社区建设五、持续更新与优化《游戏力&#xff1a;竞技游戏设计实战教程》亮点编辑推荐内容简介目录获取方式 随着科技的飞速发展和游戏产业的不断壮大&#xff0c;现代玩…

通讯协议----USB2.0协议

USB2.0协议 USB总线的信号常见信号数据编解码和位填充 USB设备的检测USB设备的挂起USB传输PacketPacket包种类Data PID作用 TransactionTransfer控制传输(Control Transfers):中断传输(Interrupt Transfers)同步传输(Isochronous Transfers)大容量数据传输(Bulk Transfers)控制…

安装QT时,安装进程(qt.tools.perl)运行期间出现错误

安装QT时&#xff0c;安装进程(qt.tools.perl)运行期间出现错误 解决方法

【MySQL】数据库的操作(1)

【MySQL】数据库的操作&#xff08;1&#xff09; 目录 【MySQL】数据库的操作&#xff08;1&#xff09;创建数据库数据库的编码集和校验集查看系统默认字符集以及校验规则查看数据库支持的字符集查看数据库支持的字符集校验规则校验规则对数据库的影响数据库的删除 数据库的备…

对象实例、类信息、常量、静态变量分别在运行时数据区的哪个位置?

在Java中&#xff0c;对象实例、类信息、常量、静态变量在运行时数据区的位置如下&#xff1a; 对象实例&#xff08;Object Instance&#xff09;&#xff1a;对象实例通常存储在堆&#xff08;Heap&#xff09;中。堆是用于存储动态分配的对象的内存区域&#xff0c;每个对象…

TypeScript 之 介绍和入门

TypeScript简介 它是由微软开发的自由和开源的编程语言&#xff0c; 属于静态编程语言&#xff0c;在编写的时候会直接检测错误。 它是JavaScript的超集&#xff0c; TypeScript需要通过编译器将其编译生成为JavaScript文件才能运行&#xff0c;因此该语言的运行要比JavaScrip…

06 - 镜像管理之:基础知识

1 了解镜像 Docker镜像是一个特殊的文件系统&#xff0c;除了提供容器运行时所需的程序、库、资源、配置等文件外&#xff0c;还包含了一些为运行时准备的一些配置参数&#xff08;如匿名卷、环境变量、用户等&#xff09;。 但注意&#xff0c; 镜像不包含任何动态数据&#…

什么是Linux?

目录 什么是Linux&#xff1f; Linux一般可以做什么&#xff1f; 什么是Linux&#xff1f; Linux是一个开源的类Unix操作系统。它的内核由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在1991年首次发布。Linux操作系统遵循自由和开源软件发展模型&#xff0c;意味着…

信呼OA普通用户权限getshell方法

0x01 前言 信呼OA是一款开源的OA系统&#xff0c;面向社会免费提供学习研究使用&#xff0c;采用PHP语言编写&#xff0c;搭建简单方便&#xff0c;在中小企业中具有较大的客户使用量。从公开的资产治理平台中匹配到目前互联中有超过1W的客户使用案例。 信呼OA目前最新的版本是…

【微软技术】介绍

微软技术 微软是一家全球领先的技术公司&#xff0c;创立于1975年&#xff0c;由比尔盖茨和保罗艾伦共同创立&#xff0c;微软开发、制造、许可、支持和销售各种电脑软件、消费电子产品、个人电脑和相关服务。以下将介绍一些微软的关键技术和产品&#xff1a; Windows 操作系统…

SpringSecurity接口权控(权限控制)

最近项目需要做“接口权限”控制&#xff0c;但不需要做RBAC (Role Based Access Control)这种大的业务。于是有下面的方案。 一、项目pom文件 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artif…

WSL2-在Ubuntu-22.04上安装MySQL(deb包)并配置ODBC

启用 systemd 通过链接启用 systemdhttps://learn.microsoft.com/zh-cn/windows/wsl/systemd#how-to-enable-systemd sudo nano /etc/wsl.conf #在文件中添加如下内容&#xff1a; [boot] systemdtrue #添加后重启WSL wsl.exe --shutdown 否则会出现如下错误&#xff1a;ERRO…

【HTML】HTML基础7.1(无序列表)

目录 标签 属性 效果 注意 标签 <ul> <li>列表里要装的东西</li> <li>列表里要装的东西</li> <li>列表里要装的东西</li> </ul> 属性 type&#xff1a; circle空心圆disc实心圆square方框 效果 circle空心圆效果…

operator-sdk入门(mac)

1. 安装operator-sdk brew install operator-sdk 2. 安装kubebuilder brew install kubebuilder 3.初始化一个operator脚手架 3.1 新建一个文件夹 redis-operator 3.2 执行初始化 operator-sdk init --domain lyl.com --repo github.com 参数介绍 可以通过operator-sdk --…

推荐系统评价指标介绍--CG, DCG, NDCG

基础概念 首先明确CG这一系列指标既可用于打分场景&#xff0c;又可用于点击场景&#xff0c;用于判断模型给出的推荐列表 y ^ \hat{y} y^​和用户打分&#xff08;点击列表&#xff09; r e l rel rel之间的相似性。  基于CG的评价指标的计算 基础流程为&#xff1a; 依据前…

STM32CubeMX学习笔记11 ---RTC实时时钟

1、RTC实时时钟简介 STM32的实时时钟RTC是一个独立的定时器&#xff0c;RTC模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能&#xff0c;修改计数器的值可以重新设置系统当前的时间和日期 RTC模块和时钟配置系统&#xff08;RCC_B…

android开发教程百度网盘,成功入职网易月薪35K

前情 首先介绍一下自己的情况吧&#xff0c;由于当年高中年少轻狂&#xff0c;不努力&#xff0c;差二本线16分。我自己也没有意识到学历的区别&#xff0c;最终听了家里的安排上了一个专科&#xff0c;电气专业。 现在想想都很后悔&#xff0c;当年为什么没有自己的主见&…

Golang各版本的GC详解

go v1.3的标记清除法 清除的第一步&#xff1a;stw将可达对象标记删除未被标记对象 go v1.5三色标记法 从根节点出发&#xff0c;将下一个节点遍历为灰色&#xff0c;放入灰色集合中遍历灰色节点集合&#xff0c;把灰色能到达的节点标记为灰色&#xff0c;把自身标记为黑色&a…

【C语言】还有柔性数组?

前言 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。C99中&#xff0c;结构中的最后⼀个元素允许是未知⼤⼩的数组&#xff0c;这就叫做『柔性数组』成员。 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xf…

C if...else 语句

一个 if 语句 后可跟一个可选的 else 语句&#xff0c;else 语句在布尔表达式为 false 时执行。 语法 C 语言中 if…else 语句的语法&#xff1a; if(boolean_expression) {/* 如果布尔表达式为真将执行的语句 */ } else {/* 如果布尔表达式为假将执行的语句 */ }如果布尔表…