FloodFill(图像渲染)(1)

一.题目

733. 图像渲染 - 力扣(LeetCode)

二.思路讲解

2.1 审题

本题要求从给定的起始像素 (sr, sc) 出发,将其颜色 改为新颜色 color,然后递归地 将与其四方向相邻颜色相同 的像素也改为新颜色,直到所有相连的同色区域都被填充。这本质上是一个连通区域填充问题。

2.2 思路讲解

由于起点和填充规则已经明确,我们只需采用深度优先搜索(DFS) 或来遍历所有与起点相连且颜色相同的格子。从起点开始,将其颜色改为 color,然后向上下左右四个方向探索,如果相邻格子在边界内未被访问过 、且颜色与原始颜色相同 ,则递归地执行相同操作。注意剪枝:若新颜色与原始颜色相同,则无需操作,直接返回原图,不然递归会死循环!

三.代码演示

cpp 复制代码
class Solution {
public:
    int new_color;
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
    int row,col;
    int target;
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color)
    {
        //避免要改的和自己本来的值相同
        if(color == image[sr][sc])
            return image;

        //初始化
        target = image[sr][sc];//获得和它相同的值
        row = image.size(),col = image[0].size();
        new_color = color;
        

        dfs(image,sr,sc);
        return image;
    }
    void dfs(vector<vector<int>>& image,int i,int j)
    {
        image[i][j] = new_color;//变化它为新color
        for(int k = 0;k < 4;k++)
        {
            int x = i + dx[k],y = j + dy[k];
            if(x >= 0 && y >= 0 && x < row && y < col && image[x][y] == target)
            {
                dfs(image,x,y);
            }
        }
    }

};

四.代码讲解

一、全局变量与数据结构
  • new_color:整型变量,存储目标新颜色。

  • target:整型变量,存储原始起点的颜色,用于判断相邻格子是否属于同一连通区域。

  • rowcol:成员变量,存储图像的行数和列数。

  • 方向数组 dx[4]dy[4]:表示上下左右四个方向的偏移量,方便探索相邻像素。

二、主函数 floodFill
  1. 首先判断如果新颜色 color 等于起点像素的原始颜色,则无需填充,直接返回原图。

  2. 否则,记录起点原始颜色到 target,获取图像尺寸到 rowcol,保存新颜色到 new_color

  3. 调用递归函数 dfs,从起点 (sr, sc) 开始进行深度优先搜索。

  4. 最后返回修改后的图像 image

三、递归函数 dfs

dfs(image, i, j) 表示将当前像素 (i, j) 的颜色改为新颜色,并继续向其四周扩散。执行流程如下:

1. 修改当前像素颜色

image[i][j] 设为 new_color,表示该像素已被填充。

2. 向四个方向探索

使用 for 循环遍历四个方向,计算新坐标 (x, y)。对于每个方向,检查该相邻像素是否合法:

  • 边界检查x >= 0 && y >= 0 && x < row && y < col

  • 颜色匹配image[x][y] == target,即与起点原始颜色相同。

如果满足条件,则递归调用 dfs(image, x, y),继续填充该相邻像素。

四、关键细节
  • 提前返回:当新颜色与起点原始颜色相同时,无需任何操作,直接返回原图,避免死循环和无效递归。

  • 无需访问标记数组 :因为每次填充后颜色被修改为新颜色,不再等于 target,所以自然避免了重复访问。

相关推荐
vibecoding日记7 小时前
双非如何快速入职字节等大厂大模型?真实案例分析:推理优化和投机解码
算法·求职·大模型工程师
yszaygr21389 小时前
Verilog参数化游程编码RLE模块
算法
望易9 小时前
刚设计的大模型架构-双域耦合认知框架
算法·架构
复杂网络13 小时前
多个 Claude Code 与多个 Codex 协同工作:设计与实现方案
算法
apocelipes1 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
HjhIron1 天前
面试常客:字符串算法从入门到进阶
算法·面试
吴佳浩1 天前
DeepSeek DSpark:Confidence-Scheduled Speculative Decoding 技术解析
人工智能·算法·deepseek
触底反弹1 天前
🧠 搞懂 Token,才算真正入门大模型——从分词原理到 Embedding 语义实战
javascript·人工智能·算法
vivo互联网技术1 天前
ICLR 2026 | 基于后验采样的图像恢复方法LearnIR:人脸去阴影、去雾
人工智能·算法·aigc