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

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算法字面意思就是洪水灌溉法&#xff0c;比如我们有这么一块地&#xff1a; 0表示平原&#xff0c;正数表示高地&#xff0c;负数表示凹地&#xff0c;那么当洪水来临时这些凹地会被优先灌满。而我们要找的正是这些联通块&#xff0c;如&…...

H5接入支付宝手机网站支付并实现

小程序文档 - 支付宝文档中心 1.登录 支付宝开放平台 创建 网页/移动应用 2.填写创建应用信息 3.配置开发设置 4.网页/移动应用&#xff1a;需要手动上线。提交审核后&#xff0c;预计 1 个工作日的审核时间。详细步骤可点击查看 上线应用 。应用上线后&#xff0c;还需要完成…...

基于SpringBoot+uniapp的在线办公小程序+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、普通用户功能模块&#xff1a;员工管理、部门信息管理、职位信息管理、会议记录、待办事项、工资信息、留言板等技术选型&#xff1a;SpringBoot&#xff0c;Vue&#xff08;后端管理web&#xff09;&#xff0c;uniapp等测试环境&…...

文章精读篇——OMG-LLaVA

题目&#xff1a;OMG-LLaVA: Bridging Image-level, Object-level, Pixel-level Reasoning and Understanding 会议&#xff1a;Conference on Neural Information Processing Systems 2024 论文&#xff1a;http://arxiv.org/abs/2406.19389 主页&#xff1a;https://lxtgh…...

两个同一对象targetList和 sourceList 去重

我现在需要解决的问题是从一个Java的源列表`sourceList`中移除所有在目标列表`targetList`中存在的数据,并且还要去除`targetList`中的重复数据。让我先理清楚这两个问题的思路。 首先,如何快速从`sourceList`中移除含有`targetList`的数据。这里的“含有”应该是指两个列表中…...

软件开发 | GitHub企业版常见问题解读

什么是GitHub企业版&#xff1f; GitHub企业版是一个企业级软件开发平台&#xff0c;专为现代化开发的复杂工作流程而设计。 作为可扩展的平台解决方案&#xff0c;GitHub企业版使组织能够无缝集成其他工具和功能&#xff0c;并根据特定需求定制开发环境&#xff0c;提高整体…...

Docker 网络的配置与管理

目录 查看所有网络 查看网络详细信息 创建新的网络 删除网络 清理未使用的网络 将容器连接到网络 将容器从网络中断开 将容器端口映射到宿主机 绑定到特定 IP 地址 为容器设置自定义 DNS 查看所有网络 docker network ls 功能&#xff1a;列出所有 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)时间复杂度

题目&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那俩个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返…...

elementui: el-dialog的header设置样式不生效

问&#xff1a; el-dialog的header设置样式不生效 回答&#xff1a; 场景&#xff1a; <el-dialogv-model"dialogVisible"width"800px":before-close"beforeClose"append-to-body:close-on-click-modal"false"title"增加文…...

libpcap 的使用

1.libpcap的模式 有线环境: 使用混杂模式promisous&#xff0c;完成监听无线环境: 使用监听模式monitor&#xff0c;完成监听 2.交叉编译libpcap 设置好交叉编译工具链后下载libpcap源码使用configure进行构建&#xff1a;–disable-shared 构建静态库&#xff0c;–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 提供了一系列注解来简化测试代码的编写&#xff0c;减少手动创建和管理 Mock 对象的样板代码。结合 JUnit 5&#xff0c;可以更高效地构建清晰、易维护的单元测试。 1. 核心注解概览 注解作用Mock创建并注入一个 Mock 对象&#xf…...

当没有OpenGL时,Skia如何绘制?

Skia 是可以在没有 OpenGL 的情况下进行图形绘制的&#xff0c;但是具体能否成功绘制图形&#xff0c;取决于 Skia 是如何配置的&#xff0c;以及平台上是否提供了其他的底层图形 API。 Skia 的底层依赖 Skia 的目标是提供一种跨平台的 2D 图形绘制接口。为了加速图形渲染&…...

SaaS+AI应用架构:业务场景、智能体、大模型、知识库、传统工具系统

SaaSAI应用架构&#xff1a;业务场景、智能体、大模型、知识库、传统工具系统 大家好&#xff0c;我是汤师爷~ 在SaaS与AI应用的演进过程中&#xff0c;合理的架构设计至关重要。本节将详细介绍其五个核心层次&#xff1a; 业务场景层&#xff1a;发现和确定业务场景智能体层…...

Go 语言中如何高效地处理集合

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

布隆过滤器到底是什么东西?它有什么用

布隆过滤器&#xff1a;用概率换空间的奇妙数据结构 引言&#xff1a;当空间成为奢侈品 在互联网每天产生2.5万亿字节数据的时代&#xff0c;Google每秒处理超过9万次搜索请求&#xff0c;Redis缓存系统支撑着百万级QPS的访问。面对如此海量的数据处理需求&#xff0c;传统的…...

【数据结构初阶第十节】队列(详解+附源码)

好久不见。。。别不开心了&#xff0c;听听喜欢的歌吧 必须有为成功付出代价的决心&#xff0c;然后想办法付出这个代价。云边有个稻草人-CSDN博客 目录 一、概念和结构 二、队列的实现 Queue.h Queue.c test.c Relaxing Time&#xff01; ————————————《有没…...

沪深300股指期权能对股指期货进行完全套保吗?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 沪深300股指期权能对股指期货进行完全套保吗&#xff1f; 沪深300股指期权是以沪深300指数为标的物的期权&#xff0c;而沪深300股指期货则是以该指数作为标的的期货合约。 理…...

JAVA学习第三天

继承关系变量访问的特点 01.方法中找 02.子类变量定义中找 03.父类中找 this和super关键字的使用区别&#xff1a; super父类构造函数的使用&#xff1a; 使用子类构造函数时&#xff0c;都会初始化父类的数据&#xff0c;自动调用父类的无参构造函数 super内存图——007 继…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...