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

代码随想录算法训练营第五十一天|99.岛屿数量 深搜 、99.岛屿数量 广搜、岛屿的最大面积

#99. 岛屿数量

深度优先搜索:

每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

本题思路:用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。

def dfs(grid, visited, x, y):if visited[x][y] or grid[x][y] == 0:return  # 终止条件:访问过的节点 或者 遇到海水visited[x][y] = True  # 标记访问过directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]  # 四个方向(上右下左的顺序)for dx, dy in directions:nextx = x + dxnexty = y + dyif 0 <= nextx < len(grid) and 0 <= nexty < len(grid[0]):  # 检查是否越界dfs(grid, visited, nextx, nexty)def main():n, m = map(int, input().split())grid = [list(map(int, input().split())) for _ in range(n)]visited = [[False] * m for _ in range(n)]result = 0for i in range(n):for j in range(m):if not visited[i][j] and grid[i][j] == 1:result += 1  # 遇到没访问过的陆地,+1dfs(grid, visited, i, j)  # 将与其链接的陆地都标记上 Trueprint(result)if __name__ == "__main__":main()

广度优先搜索:

from collections import dequedef bfs(grid, visited, x, y):# 使用deque实现队列queue = deque([(x, y)])visited[x][y] = True  # 加入队列后立即标记为已访问directions = [[0,1],[1,0],[0,-1],[-1,0]]while queue:curx, cury = queue.popleft()  # 从队列中取出当前位置for dx, dy in directions:  # 遍历四个方向nextx, nexty = curx + dx, cury + dy# 检查新位置是否在网格内if 0 <= nextx < len(grid) and 0 <= nexty < len(grid[0]):# 如果新位置未被访问且是陆地,则加入队列并标记为已访问if not visited[nextx][nexty] and grid[nextx][nexty] == 1:queue.append((nextx, nexty))visited[nextx][nexty] = Truedef main():n, m = map(int, input().split())# 使用列表推导式初始化网格和访问记录grid = [list(map(int, input().split())) for _ in range(n)]visited = [[False] * m for _ in range(n)]result = 0# 遍历网格,找到未访问的陆地,计算陆地区域数量for i in range(n):for j in range(m):if not visited[i][j] and grid[i][j] == 1:result += 1bfs(grid, visited, i, j)print(result)if __name__ == "__main__":main()

100. 岛屿的最大面积

DFS写法:

dfs只处理下一个节点,即在主函数遇到岛屿就计数为1,dfs处理接下来的相邻陆地

def dfs(grid, visited, x, y):# 定义四个方向directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]if visited[x][y] or grid[x][y] == 0:  # 终止条件:访问过的节点 或者 遇到海水returnvisited[x][y] = True  # 标记访问过global count  # 使用全局变量count,因为需要在dfs调用之间共享状态count += 1for dx, dy in directions:nextx = x + dxnexty = y + dy# 检查新坐标是否越界if 0 <= nextx < len(grid) and 0 <= nexty < len(grid[0]):dfs(grid, visited, nextx, nexty)  # 递归调用dfsdef find_max_island_area(grid):# 获取网格的行数和列数n = len(grid)m = len(grid[0])# 初始化访问记录矩阵visited = [[False] * m for _ in range(n)]# 初始化结果变量result = 0for i in range(n):  # 遍历网格for j in range(m):if not visited[i][j] and grid[i][j] == 1:  # 如果是未访问的陆地count = 0  # 重置计数器dfs(grid, visited, i, j)  # 执行深度优先搜索result = max(result, count)  # 更新最大陆地区域大小return result

BFS写法:

from collections import dequeclass Solution:def maxAreaOfIsland(self, grid):# 定义四个方向self.dir = [[0, 1], [1, 0], [0, -1], [-1, 0]]# 初始化结果变量result = 0# 遍历网格,寻找未访问的陆地for i in range(len(grid)):for j in range(len(grid[0])):if grid[i][j] == 1:# 使用bfs算法计算陆地区域大小area = self.bfs(grid, i, j)result = max(result, area)return resultdef bfs(self, grid, x, y):# 检查坐标是否越界if x < 0 or x >= len(grid) or y < 0 or y >= len(grid[0]):return 0# 访问记录集合visited = [[False] * len(grid[0]) for _ in range(len(grid))]# 初始化队列queue = deque([(x, y)])# 初始化陆地区域计数count = 1while queue:# 从队列中取出当前坐标xx, yy = queue.popleft()# 标记当前坐标为已访问visited[xx][yy] = True# 遍历四个方向for dx, dy in self.dir:nextx, nexty = xx + dx, yy + dy# 如果新坐标在网格内且未被访问过且是陆地if 0 <= nextx < len(grid) and 0 <= nexty < len(grid[0]) and not visited[nextx][nexty] and grid[nextx][nexty] == 1:# 将新坐标加入队列queue.append((nextx, nexty))# 标记新坐标为已访问visited[nextx][nexty] = True# 更新陆地区域计数count += 1return count# 示例使用
# 假设有一个网格
grid = [[1, 1, 0, 0, 0],[1, 1, 0, 0, 0],[0, 0, 0, 1, 1],[0, 0, 0, 1, 1]
]
# 创建Solution实例并调用maxAreaOfIsland方法
solution = Solution()
print(solution.maxAreaOfIsland(grid))

相关文章:

代码随想录算法训练营第五十一天|99.岛屿数量 深搜 、99.岛屿数量 广搜、岛屿的最大面积

#99. 岛屿数量 深度优先搜索&#xff1a; 每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 本题思路&#xff1a;用遇到一个没有遍历过的节点陆地&#xff0c;计数器就加一&#xff0c;然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋…...

【c++刷题笔记-图论】day62:Floyd 算法、A * 算法精讲

Floyd 算法 重点&#xff1a;多源最短路径算法&#xff0c;前的最短路径算法是单源的也就是只有一个起点。递推每个节点之间最短的路径 时间复杂度&#xff1a; O(n^3)空间复杂度&#xff1a;O(n^2) #include <iostream> #include <vector> using namespace std…...

FPGA知识基础之--clocking wizard ip核的使用以及modelsim与vivado联合仿真

目录 前言一、ip核是什么&#xff1f;1.1 定义1.2 分类 二、为什么使用ip核2.1 ip核的优点2.2 ip核的缺点 三、如何使用ip核&#xff08;vivado&#xff09;四、举例&#xff08;clocking wizard ip核&#xff09;4.1 简介4.2 实验任务4.3 程序设计4.3.1 系统模块4.3.2 波形绘制…...

Java中的分布式日志与追踪

随着微服务架构的流行&#xff0c;分布式系统变得越来越复杂。在分布式系统中&#xff0c;日志和追踪是两个关键的工具&#xff0c;用于监控系统的健康状态、故障排除和性能优化。本文将详细探讨Java中的分布式日志与追踪&#xff0c;介绍相关的技术和工具&#xff0c;并通过代…...

案例精选 | 某省级妇幼保健院自动化安全运营中心建设成功实践

某省级妇幼保健院&#xff0c;是一所集医疗、保健、教学、科研、预防、康复于一体的省级三级甲等妇幼保健机构&#xff0c;专注于为全省妇女儿童提供全方位、高质量的医疗保健服务。医院拥有4个院区&#xff0c;总建筑面积10万平米&#xff0c;开放床位700张&#xff0c;年门诊…...

数字化时代:传统行业的转型之路在何方?

​在当前数字化时代的浪潮中&#xff0c;传统行业面临着新挑战与新机遇。为了在激烈的市场竞争中立足并谋求发展&#xff0c;传统行业的运营必须积极拥抱数字化转型。蚓链数字化解决方案帮助你总结如下。 数字化思维&#xff1a;开启转型之门的钥匙 数字化思维是传统行业转型的…...

【STM32系统】基于STM32设计的按键PWM控制舵机窗帘柜子门禁家居等控制系统——文末资料下载

演示视频 基于stm32设计的按键PWM控制舵机窗帘&柜子&门禁&家居等控制系统——完整资料下载 摘要 随着智能家居技术的不断发展&#xff0c;舵机在自动化家居设备中的应用变得越来越广泛。本文设计并实现了一种基于STM32单片机的按键PWM控制舵机系统。通过按键可以精…...

【生成式人工智能-八-大型语言模型的能力评估】

语言模型的能力评估 评估难度来自哪里输出没办法确定给出选择题本身就没标准答案 评估方法人力用语言模型来评估语言模型语言模型的偏爱 评估语言模型的数据集评估模型的不同能力阅读长文的能力心智测验道德性测试安全性测试 通常情况下我们想到的语言模型能力评估&#xff0c;…...

Qt ts文件详解

Qt ts文件&#xff08;Translation Source file&#xff1a;翻译源文件&#xff09;是Qt框架中用于存储翻译文本和相关上下文信息的一种特定格式文件&#xff0c;它是Qt Linguist&#xff08;语言家&#xff09;工具使用的基础。Qt Linguist是Qt开发工具包中的一个应用程序&…...

操作系统 IO 相关知识

操作系统 IO 相关知识 阻塞与非阻塞同步与异步IO 和系统调用传统的 IODMAmmap 内存映射sendfilesplice 常用的 IO 模型BIO&#xff1a;同步阻塞 IONIO&#xff1a;同步非阻塞 IOIO 多路复用信号驱动 IOAIO&#xff1a;异步 IO 模型 IO 就是计算机内部与外部进行数据传输的过程&…...

C++_手写share_ptr

以下是一个简化版的 shared_ptr 的实现&#xff1a; #include <iostream> template <typename T> class SimpleSharedPtr { public:// 构造函数explicit SimpleSharedPtr(T* ptr nullptr) : ptr_(ptr), count_(ptr ? new size_t(1) : nullptr) {}// 拷贝构造函数…...

【启明智显方案分享】6.86寸高清显示屏音频效果器解决方案

一、项目概述 本方案旨在设计一款集成6.86寸高清触摸显示屏的音频效果器&#xff0c;通过HMI&#xff08;Human-Machine Interface&#xff09;芯片Model 4驱动&#xff0c;实现高清晰度的视觉交互。该设备不仅支持音乐、麦克风及温响音量的精细控制&#xff0c;还内置丰富的预…...

vue设置每次加载页面时展示一个双开门效果

一、首先创建一个双开门的蒙层组件 <!-- DoorOverlay.vue --> <template><div v-if"isVisible" class"door-overlay"><div class"door left-door"></div><div class"door right-door"></div&…...

简单的docker学习 第8章 docker常用服务安装

第8章 常用服务安装 本章主要学习最常用的&#xff0c;也是安装起来稍有些麻烦的 MySQL 与 Redis 两种服务器的Docker 安装。至于其它服务器的 Docker 安装&#xff0c;大家可自行查找资料。只要 MySQL 与 Redis这两类服务器学会了安装&#xff0c;其它服务器的安装基本也不会…...

01、MySQL-DDL(数据定义语言)

目录 1、查询 2、创建 3、修改 4、删除 1、查询 1、查询所有数据库 show databases; 2、查询当前数据库 select database(); 3、查询当前数据库中所有的表&#xff08;需要先进入这个数据库&#xff09; use d1; show tables; 4、查询表结构 desc users; 5、查询指定表的建…...

RT-Thread 操作系统 之 线程间同步 IO设备模型

RT-Thread 操作系统 之 线程间同步 IO设备模型 一、线程间同步1.1、信号量1.1.1、信号量结构体1.1.2、信号量的使用和管理1.1.3、信号量同步例程 1.2、互斥量1.2.1、互斥量的使用和管理 1.3、事件集1.3.1、事件集使用和管理方法1.3.2、事件集三个线程同步实例 二、IO设备模型2.…...

力扣leetcode移动0(C++)

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...

阿里云部署open-webui实现openai代理服务

一、 环境准备 1. 阿里云服务器&#xff0c;ubuntu22系统 2. 外网服务器&#xff0c;linux系统 3. openai API Key 二、实际操作记录(阿里云服务器端) 1. 根据官方文档安装open-webui服务端: &#x1f680; Getting Started | Open WebUI 1. 如果服务器配置比较低&#xff0c;…...

你的工作环境,选对劳保鞋了吗?守护安全,从脚下开始!

在众多的工作场所中&#xff0c;我们穿梭于不同的工作环境&#xff0c;从繁忙的工厂车间到复杂的建筑工地&#xff0c;再到需要精细操作的实验室……每一步都承载着对安全的期许和对效率的追求。但你是否意识到&#xff0c;脚下那双不起眼的劳保鞋&#xff0c;其实是守护你安全…...

【Linux】编译器gcc/g++ 、程序翻译过程、动静态库

目录 1.gcc/g Linux编译器1.1. gcc与g的安装1.2. gcc与g用法1.2.1.gcc用法1.2.2. g用法 1.3. 程序翻译的过程1.3.1. 前提知识&#xff1a;1.3.2. 预处理&#xff08;语言种类不变&#xff09;条件编译用途&#xff1a; 1.3.3. 编译&#xff08;生成汇编语言&#xff09;1.3.4. …...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...