FloodFill算法——搜索算法
一、什么是FloodFill算法
FloodFill算法字面意思就是洪水灌溉法,比如我们有这么一块地:
0表示平原,正数表示高地,负数表示凹地,那么当洪水来临时这些凹地会被优先灌满。而我们要找的正是这些联通块,如:

它是一种暴力搜索的思想,只要我们把每个地方都搜索一遍,那么最终的结果必定会水落石出。 通常可以使用BFS、DFS或并查集解决。
BFS(广度优先搜索)——搜索算法_广度优先搜索bfs-CSDN博客
DFS+回溯+剪枝(深度优先搜索)——搜索算法-CSDN博客
接下来我们直接从题中感受。
二、试题一:岛屿数量

我们可以使用两层for循环找到没有搜索过的“1”然后在从这个“1”开始进行BFS或DFS展开,在期间使用哈希表记录每个“1”是否已经搜索过。每一次新的展开之前做一下计数,最后得到最终答案。
BFS代码示例:
class Solution {
public:int n=0,m=0,ret=0;int dx[4]={0,0,-1,1},dy[4]={-1,1,0,0};int numIslands(vector<vector<char>>& grid){n=grid.size(),m=grid[0].size(); vector<vector<bool>> hash(n,vector<bool>(m));for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(grid[i][j]=='1'&&!hash[i][j]) bfs(i,j,grid,hash); return ret;}void bfs(int i,int j,vector<vector<char>>& grid,vector<vector<bool>>& hash){ret++;queue<pair<int,int>> q;hash[i][j]=true;q.push({i,j});while(!q.empty()){auto [a,b] = q.front();q.pop();for(int k=0;k<4;k++){int x=a+dx[k],y=b+dy[k];if(x>=0&&x<n&&y>=0&&y<m&&grid[x][y]=='1'&&!hash[x][y]){q.push({x,y});hash[x][y]=true;}}}}
};
DFS代码示例:
class Solution {
public:int n=0,m=0,ret=0;int dx[4]={0,0,-1,1},dy[4]={-1,1,0,0};int numIslands(vector<vector<char>>& grid){n=grid.size(),m=grid[0].size();vector<vector<bool>> hash(n,vector<bool>(m));for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(grid[i][j]=='1'&&!hash[i][j]){ret++;dfs(i,j,grid,hash);}return ret;}void dfs(int i,int j,vector<vector<char>>& grid,vector<vector<bool>>& hash){hash[i][j]=true;for(int k=0;k<4;k++){int x=i+dx[k],y=j+dy[k];if(x>=0&&x<n&&y>=0&&y<m&&grid[x][y]=='1'&&!hash[x][y])dfs(x,y,grid,hash);}}
};
三、试题二:太平洋大西洋水流问题

按题意,如果一个数能够与上边界和左边界元素联通,那么它就能流入“太平洋”,如果与右边界或下边界元素联通则流入“大西洋” 。
如果我们一个元素一个元素的去搜索,去看它流入“太平洋”,还是“大西洋”,那么效率势必会很低。我们可以直接从边界扩展,能被上边界和左边界扩展到的是“太平洋”,能被下边界和右边界扩展到的是“大西洋”。所以需要使用一个哈希表记录两个状态(“大西洋,“太平洋”),可以使用一个pair<bool,bool>作为哈希表的元素类型。
DFS代码示例:
class Solution {
public:vector<vector<pair<bool,bool>>> hash;int n=0,m=0;vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights){n=heights.size(),m=heights[0].size();hash.resize(n);for(int i=0;i<n;i++) hash[i].resize(m,{false,false});for(int j=0;j<m;j++) dfs(0,j,heights,1),dfs(n-1,j,heights,2);for(int i=0;i<n;i++) dfs(i,0,heights,1),dfs(i,m-1,heights,2);vector<vector<int>> ret;for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(hash[i][j].first&&hash[i][j].second) ret.push_back({i,j});return ret;}int dx[4]={0,0,1,-1},dy[4]={-1,1,0,0};void dfs(int i,int j,vector<vector<int>>& heights,int f){f==1?hash[i][j].first=true:hash[i][j].second=true;for(int k=0;k<4;k++){int x=dx[k]+i,y=dy[k]+j;if(x>=0&&x<n&&y>=0&&y<m&&heights[i][j]<=heights[x][y]){if(f==1&&hash[x][y].first) continue;if(f==2&&hash[x][y].second) continue;dfs(x,y,heights,f);}}}
};
BFS代码示例:
class Solution {
public:vector<vector<pair<bool,bool>>> hash;int n=0,m=0;vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights){n=heights.size(),m=heights[0].size();hash.resize(n);for(int i=0;i<n;i++) hash[i].resize(m,{false,false});for(int j=0;j<m;j++) bfs(0,j,heights,1),bfs(n-1,j,heights,2);for(int i=0;i<n;i++) bfs(i,0,heights,1),bfs(i,m-1,heights,2);vector<vector<int>> ret;for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(hash[i][j].first&&hash[i][j].second) ret.push_back({i,j});return ret;}int dx[4]={0,0,1,-1},dy[4]={-1,1,0,0};void bfs(int i,int j,vector<vector<int>>& heights,int f){f==1?hash[i][j].first=true:hash[i][j].second=true;queue<pair<int,int>> q;q.push({i,j});while(!q.empty()){auto [a,b] = q.front();q.pop();for(int k=0;k<4;k++){int x=a+dx[k],y=b+dy[k];if(x>=0&&x<n&&y>=0&&y<m&&heights[a][b]<=heights[x][y]){if(f==1&&hash[x][y].first) continue;if(f==2&&hash[x][y].second) continue;f==1?hash[x][y].first=true:hash[x][y].second=true;q.push({x,y});}}}}
};
相关文章:
FloodFill算法——搜索算法
一、什么是FloodFill算法 FloodFill算法字面意思就是洪水灌溉法,比如我们有这么一块地: 0表示平原,正数表示高地,负数表示凹地,那么当洪水来临时这些凹地会被优先灌满。而我们要找的正是这些联通块,如&…...
H5接入支付宝手机网站支付并实现
小程序文档 - 支付宝文档中心 1.登录 支付宝开放平台 创建 网页/移动应用 2.填写创建应用信息 3.配置开发设置 4.网页/移动应用:需要手动上线。提交审核后,预计 1 个工作日的审核时间。详细步骤可点击查看 上线应用 。应用上线后,还需要完成…...
基于SpringBoot+uniapp的在线办公小程序+LW示例参考
1.项目介绍 系统角色:管理员、普通用户功能模块:员工管理、部门信息管理、职位信息管理、会议记录、待办事项、工资信息、留言板等技术选型:SpringBoot,Vue(后端管理web),uniapp等测试环境&…...
文章精读篇——OMG-LLaVA
题目:OMG-LLaVA: Bridging Image-level, Object-level, Pixel-level Reasoning and Understanding 会议:Conference on Neural Information Processing Systems 2024 论文:http://arxiv.org/abs/2406.19389 主页:https://lxtgh…...
两个同一对象targetList和 sourceList 去重
我现在需要解决的问题是从一个Java的源列表`sourceList`中移除所有在目标列表`targetList`中存在的数据,并且还要去除`targetList`中的重复数据。让我先理清楚这两个问题的思路。 首先,如何快速从`sourceList`中移除含有`targetList`的数据。这里的“含有”应该是指两个列表中…...
软件开发 | GitHub企业版常见问题解读
什么是GitHub企业版? GitHub企业版是一个企业级软件开发平台,专为现代化开发的复杂工作流程而设计。 作为可扩展的平台解决方案,GitHub企业版使组织能够无缝集成其他工具和功能,并根据特定需求定制开发环境,提高整体…...
Docker 网络的配置与管理
目录 查看所有网络 查看网络详细信息 创建新的网络 删除网络 清理未使用的网络 将容器连接到网络 将容器从网络中断开 将容器端口映射到宿主机 绑定到特定 IP 地址 为容器设置自定义 DNS 查看所有网络 docker network ls 功能:列出所有 Docker 网络。 工…...
新手自学:如何用gromacs对简单分子复合物进行伞形采样
1、建立体系: 1、将蛋白的pdb文件转化为gmx: gmx pdb2gmx -f 2BEG_model1_capped.pdb -ignh -ter -o complex.gro 这个网页可以实现将多肽序列转化为pdb: ProBuilder On-line 这个教程的蛋白2BFG包含两条链(chain A和B) 在生成的topol文件中,增加如下的内容,效果就…...
力扣第一题 哈希解法 O(n)时间复杂度
题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那俩个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返…...
elementui: el-dialog的header设置样式不生效
问: el-dialog的header设置样式不生效 回答: 场景: <el-dialogv-model"dialogVisible"width"800px":before-close"beforeClose"append-to-body:close-on-click-modal"false"title"增加文…...
libpcap 的使用
1.libpcap的模式 有线环境: 使用混杂模式promisous,完成监听无线环境: 使用监听模式monitor,完成监听 2.交叉编译libpcap 设置好交叉编译工具链后下载libpcap源码使用configure进行构建:–disable-shared 构建静态库,–host 、…...
ArcGISPro AA表O_Name字段 内容 复制到BB表BB字段里
import arcpy# 设置工作空间和要处理的表路径 resource_shape_table r"AA表.shp" # 源表路径 resource_assets_table r"BB表.shp" # 目标表路径# 使用 SearchCursor 读取源表中的 O_Name 字段 with arcpy.da.SearchCursor(resource_shape_table, [O_Na…...
2.5 使用注解进行单元测试详解
Mockito 使用注解进行单元测试详解 Mockito 提供了一系列注解来简化测试代码的编写,减少手动创建和管理 Mock 对象的样板代码。结合 JUnit 5,可以更高效地构建清晰、易维护的单元测试。 1. 核心注解概览 注解作用Mock创建并注入一个 Mock 对象…...
当没有OpenGL时,Skia如何绘制?
Skia 是可以在没有 OpenGL 的情况下进行图形绘制的,但是具体能否成功绘制图形,取决于 Skia 是如何配置的,以及平台上是否提供了其他的底层图形 API。 Skia 的底层依赖 Skia 的目标是提供一种跨平台的 2D 图形绘制接口。为了加速图形渲染&…...
SaaS+AI应用架构:业务场景、智能体、大模型、知识库、传统工具系统
SaaSAI应用架构:业务场景、智能体、大模型、知识库、传统工具系统 大家好,我是汤师爷~ 在SaaS与AI应用的演进过程中,合理的架构设计至关重要。本节将详细介绍其五个核心层次: 业务场景层:发现和确定业务场景智能体层…...
Go 语言中如何高效地处理集合
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
布隆过滤器到底是什么东西?它有什么用
布隆过滤器:用概率换空间的奇妙数据结构 引言:当空间成为奢侈品 在互联网每天产生2.5万亿字节数据的时代,Google每秒处理超过9万次搜索请求,Redis缓存系统支撑着百万级QPS的访问。面对如此海量的数据处理需求,传统的…...
【数据结构初阶第十节】队列(详解+附源码)
好久不见。。。别不开心了,听听喜欢的歌吧 必须有为成功付出代价的决心,然后想办法付出这个代价。云边有个稻草人-CSDN博客 目录 一、概念和结构 二、队列的实现 Queue.h Queue.c test.c Relaxing Time! ————————————《有没…...
沪深300股指期权能对股指期货进行完全套保吗?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 沪深300股指期权能对股指期货进行完全套保吗? 沪深300股指期权是以沪深300指数为标的物的期权,而沪深300股指期货则是以该指数作为标的的期货合约。 理…...
JAVA学习第三天
继承关系变量访问的特点 01.方法中找 02.子类变量定义中找 03.父类中找 this和super关键字的使用区别: super父类构造函数的使用: 使用子类构造函数时,都会初始化父类的数据,自动调用父类的无参构造函数 super内存图——007 继…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
