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

[Lc5_dfs+floodfill] 简介 | 图像渲染 | 岛屿数量

目录

0.floodfill算法简介

1.图像渲染

题解

2.岛屿数量

题解


之前我们在 bfs 中有介绍过[Lc15_bfs+floodfill] 图像渲染 | 岛屿数量 | 岛屿的最大面积 | 被围绕的区域,现在我们来看看 dfs 又是如何解决的呢

0.floodfill算法简介

floodfill算法又叫洪水灌溉或者洪水淹没

  • 比如有一个区域,负数表示低谷,0表示平原,正数表示山峰。
  • 此时发大水把这些区域淹了。其中平原和山峰可能不会改变,但是低谷水位就要上升。
  • 这种类型题目就是,我们要在这个区域中找出水位会上升的区域或者说找到会被洪水淹的区域。

其实这道题说白了就是把 性质相同的一个连通块 找出来

比如这里就是把所有是负数的连通块找到,注意只能上下左右相连,斜着不能连!

floodfill算法解决的问题就这么简单,它解决方法也非常简单

  • 可以用深度优先遍历和宽度优先遍历。
  • dfs就是一条路走到黑,如果无法走就回溯到上一层,然后能走就继续走,直到走到一个不能走的位置。(上下左右就是每层的选择,走到叶子节点的时候就找到连通块啦~)

此时就把一个连通区域找到了。

bfs从一个位置开始把和我相连的位置加入到队列里,然后继续在扩一层在扩一层…

  • 因此floodfill算法有两种解决方式,要么dfs、要么bfs。
  • 你会发现这个dfs和我们前面单词搜索,黄金矿工解法非常相似,到一个位置之后就上下左右扫描,当和我性质相同就递归进去。

这里主要用的是dfs。bfs在前面的优选算法里面,本质其实就是暴搜。


1.图像渲染

链接:733. 图像渲染

有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。你也被给予三个整数 sr , sccolor 。你应该从像素 image[sr][sc] 开始对图像进行上色 填充

为了完成 上色工作

  1. 从初始像素开始,将其颜色改为 color
  2. 对初始坐标的 上下左右四个方向上 相邻且与初始像素的原始颜色同色的像素点执行相同操作。
  3. 通过检查与初始像素的原始颜色相同的相邻像素并修改其颜色来继续 重复 此过程。
  4. 没有 其它原始颜色的相邻像素时 停止 操作。

最后返回经过上色渲染 修改 后的图像 。


题解

题目说这么多,其实就是给一个矩阵,在给一个初始的坐标,然后把和这小格性质相同的连通块找到然后变成newcolor。注意只能上下左右去找!

  • 关于题目的详细解释,可以去的 BFS 相应文章中查看
class Solution {
public:
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int m,n,ret,_color;vector<vector<int>> floodFill
(vector<vector<int>>& image, int sr, int sc, int color) 
{m=image.size();n=image[0].size();ret=image[sr][sc];image[sr][sc]=color;_color=color;if(ret==color) return image; //!!!!边界dfs(image,sr,sc);return image;
}void dfs(vector<vector<int>>& image, int i, int j)
{for(int k=0;k<4;k++){int x=i+dx[k],y=j+dy[k];if(x>=0 && x<m && y>=0 && y<n&& image[x][y]==ret){image[x][y]=_color;dfs(image,x,y);}}
}
};

if(ret==color) return image; //!!!!开始前,处理边界


2.岛屿数量

链接:200. 岛屿数量

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:grid = [["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0","0","0","0","0"]
]
输出:1

题解

这道题让找到由陆地构成的岛屿的数量,也就是让找到性质相同的连通块数量。

  • 注意只能上下左右找。
  • 1代表陆地,0代表水域。

我们一行一行扫描

  • 扫描到第一个1的时候,我就把以这个1相连的所有为1的区域都标记一下
  • 相当于找到了一块岛屿记录一下。
  • 接下来继续扫描。但是有可能会碰到重复的情况,因此这里需要一个bool类型的数组 标记当前位置是否被找过。
  • 或者可以修改原始值把它由1变成0。这里我们还用的是老方法bool类型数组。

之前走过下一就不能在走了。

class Solution {
public:int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int ret=0,m,n;vector<vector<bool>> check;int numIslands(vector<vector<char>>& grid) {m=grid.size();n=grid[0].size();check.resize(m,vector<bool>(n,false));for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(!check[i][j] && grid[i][j]=='1'){check[i][j]=true;ret++;dfs(grid,i,j);}}}return ret;}void dfs(vector<vector<char>>& grid,int i,int j){for(int k=0;k<4;k++){int x=i+dx[k],y=j+dy[k];if(x>=0 && x<m && y>=0 && y<n&& !check[x][y] &&grid[x][y]=='1'){check[x][y]=true;dfs(grid,x,y);}}} 
};
  • 一,这里的 grid 里是 char('1')
  • 二,要注意一下无论是起始,还是结束都要对 check 进行一个判断,来防止进入死循环

相关文章:

[Lc5_dfs+floodfill] 简介 | 图像渲染 | 岛屿数量

目录 0.floodfill算法简介 1.图像渲染 题解 2.岛屿数量 题解 之前我们在 bfs 中有介绍过[Lc15_bfsfloodfill] 图像渲染 | 岛屿数量 | 岛屿的最大面积 | 被围绕的区域&#xff0c;现在我们来看看 dfs 又是如何解决的呢 0.floodfill算法简介 floodfill算法又叫洪水灌溉或者…...

AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务

环境&#xff1a; AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 腾讯云ASR 问题描述&#xff1a; AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务&#xff0c;本地硬件配置不高的情况&#xff0c;建议使用云服务商的ASR 解决方案&#xff1a; 1.登…...

Qwen最新多模态大模型:Qwen2.5-Omni介绍与快速入门

一、模型技术突破&#xff1a;重新定义多模态交互 近日&#xff0c;Qwen2.5-Omni正式发布了&#xff01; 这是Qwen系列中全新的旗舰级端到端多模态大模型&#xff0c;专为全面的多模式感知设计&#xff0c;无缝处理包括文本、图像、音频和视频在内的各种输入&#xff0c;同时…...

【Golang】第十一弹------反射

&#x1f381;个人主页&#xff1a;星云爱编程 &#x1f50d;所属专栏&#xff1a;【Go】 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 长风破浪会有时&#xff0c;直挂云帆济沧海 目录 1.反射基本介绍 2.反射重要的函数和概念 3.反射应用场景 4.反…...

C#里使用libxl的对齐/边框/颜色

一份好的EXCEL文件,通道会有不同的颜色和边框来表示。 以便表示一些重要的信息,这样才能让人们一眼就看到需要关注的信息。 如下面所示: 要显示上面的内容,需要使用下面的例子: private void button12_Click(object sender, EventArgs e){var book = new ExcelBook();if…...

算法刷题记录——LeetCode篇(1.4) [第31~40题](持续更新)

更新时间&#xff1a;2025-03-29 算法题解目录汇总&#xff1a;算法刷题记录——题解目录汇总技术博客总目录&#xff1a;计算机技术系列博客——目录页 优先整理热门100及面试150&#xff0c;不定期持续更新&#xff0c;欢迎关注&#xff01; 32. 最长有效括号 给你一个只包…...

软考中级-软件设计师信息安全模块考点解析

一、防火墙技术 内部网络是 安全的可信赖的外部网络是不安全的不可信赖的外部网络和内部网络之间有一个DMZ隔离区&#xff0c; 可以在DMZ隔离区中搭建服务&#xff1a;例如&#xff1a;WEB服务器 安全排序&#xff1a;内网>DMZ>外网 三个发展阶段&#xff1a; 包过滤防…...

【蓝桥杯】每日练习 Day 16,17

前言 接下来是这两天的题目&#xff08;昨天主播打完模拟赛感觉身体被掏空所以没有写题目的总结&#xff09;&#xff0c;只有三道题。 一道并查集&#xff0c;一道单调栈和一道单调队列。 奶酪 分析 这是一道模板题&#xff08;连通块&#xff09;&#xff0c;只讲思路。 …...

相机租赁网站基于Spring Boot SSM

目录 摘要‌ 1. 项目背景与意义 2. 功能需求分析 3. 技术需求分析 ‌3.1开发语言‌&#xff1a;Java‌13。 3‌.2其他技术‌&#xff1a; 4. 系统设计与实现 5. 市场分析 6. 创新点与优势 7. 预期成果与展望 摘要‌ 随着摄影技术的普及和摄影爱好者数量的增加&#…...

树莓派超全系列文档--(14)无需交互使用raspi-config工具其一

无需交互使用raspi-config工具其一 无需交互的 raspi-configSystem optionsWireless LANAudioPasswordHostnameBoot/Auto loginNetwork at bootSplash screenPower LEDBrowser Display optionsUnderscanScreen blankingVNC resolutionComposite 文章来源&#xff1a; http://r…...

Linux驱动开发--IIC子系统

1.1 简介 I2C 是很常见的一种总线协议&#xff0c; I2C 是 NXP 公司设计的&#xff0c; I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线)&#xff0c;另外一条是 SDA(串行数据线)&#xff0c;这两条数据线需要接上拉电阻&#xff0c;总线空闲的时候 …...

如何应对硬件测试覆盖率不足导致量产故障

硬件测试覆盖率不足导致的量产故障是硬件制造领域的一大痛点。要有效应对&#xff0c;必须从提高测试覆盖率、优化测试方案、引入风险管理机制三个方面入手。其中&#xff0c;优化测试方案尤为关键&#xff0c;应从产品设计阶段开始&#xff0c;通过精确的测试用例规划、详细的…...

JS数组复制方法及注意事项

在 JavaScript 中&#xff0c;直接赋值数组会导致引用传递&#xff08;修改一个会影响另一个&#xff09;&#xff0c;因此需要创建数组的副本。以下是几种常见的浅拷贝方法&#xff1a; 1. 使用 slice() 方法 javascript const originalArray [1, 2, 3]; const copiedArra…...

【附JS、Python、C++题解】Leetcode面试150题(12)多数问题

一、题目 169. 多数元素 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。 多数元素是指在数组中出现次数大于[n/2]的元素。你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输出&a…...

Centos7 安装 TDengine

Centos7 安装 TDengine 1、简介 官网&#xff1a; https://www.taosdata.com TDengine 是一款开源、高性能、云原生的时序数据库&#xff08;Time Series Database, TSDB&#xff09;, 它专为物联网、车联网、工业互联网、金融、IT 运维等场景优化设计。同时它还带有内建的缓…...

[特殊字符]《Curve DAO 系统学习目录》

本教程旨在系统学习 Curve DAO 项目的整体架构、核心机制、合约设计、治理逻辑与代币经济等内容&#xff0c;帮助开发者全面理解其设计理念及运作方式。 目录总览&#xff1a; 1. Curve 项目概览 • 1.1 Curve 是什么&#xff1f;主要解决什么问题&#xff1f; • 1.2 与其他…...

Pandas **Series**

以下是关于 Pandas Series 的从入门到精通的系统指南&#xff0c;包含核心概念、操作技巧和实战示例&#xff1a; 1. 入门篇&#xff1a;基础操作 1.1 创建Series import pandas as pd# 从列表创建 s1 pd.Series([1, 3, 5, 7, 9]) # 默认数字索引 s2 pd.Series([10, 20, 3…...

Kafka 多线程开发消费者实例

目前&#xff0c;计算机的硬件条件已经大大改善&#xff0c;即使是在普通的笔记本电脑上&#xff0c;多核都已经是标配了&#xff0c;更不用说专业的服务器了。如果跑在强劲服务器机器上的应用程序依然是单线程架构&#xff0c;那实在是有点暴殄天物了。不过&#xff0c;Kafka …...

Linux线程池实现

1.线程池实现 全部代码&#xff1a;whb-helloworld/113 1.唤醒线程 一个是唤醒全部线程&#xff0c;一个是唤醒一个线程。 void WakeUpAllThread(){LockGuard lockguard(_mutex);if (_sleepernum)_cond.Broadcast();LOG(LogLevel::INFO) << "唤醒所有的休眠线程&q…...

Linux《进程概念(上)》

在之前的Linux学习当中我们已经了解了基本的Linux指令以及基础的开发工具的使用&#xff0c;那么接下来我们就要开始Linux当中一个非常重要的部分的学习——进程&#xff0c;在此进程是我们之后Linux学习的基础&#xff0c;并且通过进程的学习会让我们了解更多的操作系统的相关…...

【算法】并查集基础讲解

一、定义 一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题。思想是用一个数组表示了整片森林&#xff08;parent&#xff09;&#xff0c;树的根节点唯一标识了一个集合&#xff0c;只要找到了某个元素的的树根&#xff0c;就能确定它在哪个集合里。 …...

C++ STL常用算法之常用集合算法

常用集合算法 学习目标: 掌握常用的集合算法 算法简介: set_intersection // 求两个容器的交集 set_union // 求两个容器的并集 set_difference // 求两个容器的差集 set_intersection 功能描述: 求两个容器的交集 函数原型: set_intersection(iterator beg1, iterat…...

Qt warning LNK4042: 对象被多次指定;已忽略多余的指定

一、常规原因&#xff1a; pro或pri 文件中源文件被多次包含 解决&#xff1a;删除变量 SOURCES 和 HEADERS 中重复条目 二、误用 对于某些pri库可以使用如下代码简写包含 INCLUDEPATH $$PWDHEADERS $$PWD/*.hSOURCES $$PWD/*.cpp但是假如该目录下只有头文件&#xff0c;没…...

ACM模式常用方法总结(Java篇)

文章目录 一、ACM输入输出模式二、重要语法2.1、导包2.2、读取数据2.3、判断是否有下一个数据2.4、输出2.5、关闭scanner2.6、易踩坑点 一、ACM输入输出模式 在力扣上编写代码时使用的是核心代码模式&#xff0c;如果在面试中遇到ACM模式就会比较迷茫&#xff1f;ACM模式要求你…...

日程公布| 第八届地球空间大数据与云计算前沿大会与集中学习(3号通知)

日程公布| 第八届地球空间大数据与云计算前沿大会与集中学习&#xff08;3号通知&#xff09; 日程公布| 第八届地球空间大数据与云计算前沿大会与集中学习&#xff08;3号通知&#xff09;...

leetcode 28 Find the Index of the First Occurrence in a String

直接用kmp算法 class Solution { public:int strStr(string haystack, string needle) {return kmp(haystack,needle);}int kmp(std::string &text,std::string &pattern){int n text.size();int m pattern.size();if(m 0)return 0;std::vector<int> next;ne…...

MATLAB中rmfield函数用法

目录 语法 说明 示例 删除单个字段 删除多个字段 rmfield函数的功能是删除结构体中的字段。 语法 s rmfield(s,field) 说明 s rmfield(s,field) 从结构体数组 s 中删除指定的一个或多个字段。使用字符向量元胞数组或字符串数组指定多个字段。s 的维度保持不变。 示例…...

Linux C语言调用第三方库,第三方库如何编译安装

在 Linux 环境下使用 C 语言调用第三方库时&#xff0c;通常需要先对第三方库进行编译和安装。以下为你详细介绍一般的编译安装步骤&#xff0c;并给出不同类型第三方库&#xff08;如使用 Makefile、CMake 构建系统&#xff09;的具体示例。 一般步骤 1. 获取第三方库源码 …...

leetcode -编辑距离

为了求解将 word1 转换成 word2 所需的最少操作数&#xff0c;可以使用动态规划。以下是详细的解决方案&#xff1a; ### 方法思路 1. **定义状态** dp[i][j] 表示将 word1 的前 i 个字符转换成 word2 的前 j 个字符所需的最少操作数。 2. **状态转移方程** - 如果 word1[…...

【Ollama】大模型运行框架

文章目录 安装与运行导入LLMHugginface模型-转换为-GGUF模型在指定gpu上运行model存储路径设置 ollama接口 官网 github中文介绍 安装与运行 安装教程 安装 wget https://ollama.com/download/ollama-linux-amd64.tgz tar -xzvf ollama-linux-amd64.tgz添加ollama的环境变量…...