(刷题笔记) Leetcode 面试题 08.10. 颜色填充

本文介绍如何使用深度优先搜索(DFS)算法解决颜色填充问题,通过递归地检查图像中初始坐标点周围的区域,将指定颜色替换为新颜色。文章详细解释了DFS的实现过程,包括终止条件和四邻域检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

编写函数,实现许多图片编辑软件都支持的「颜色填充」功能。

待填充的图像用二维数组 image 表示,元素为初始颜色值。初始坐标点的横坐标为 sr 纵坐标为 sc。需要填充的新颜色为 newColor 。

「周围区域」是指颜色相同且在上、下、左、右四个方向上存在相连情况的若干元素。

请用新颜色填充初始坐标点的周围区域,并返回填充后的图像。

示例:

 输入:
 image = [[1,1,1],[1,1,0],[1,0,1]] 
 sr = 1, sc = 1, newColor = 2
 输出:[[2,2,2],[2,2,0],[2,0,1]]
解释: 
 初始坐标点位于图像的正中间,坐标 (sr,sc)=(1,1) 。
 初始坐标点周围区域上所有符合条件的像素点的颜色都被更改成 2 。
 注意,右下角的像素没有更改为 2 ,因为它不属于初始坐标点的周围区域。

提示:

image 和 image[0] 的长度均在范围 [1, 50] 内。
初始坐标点 (sr,sc) 满足 0 <= sr < image.length 和 0 <= sc < image[0].length 。
image[i][j] 和 newColor 表示的颜色值在范围 [0, 65535] 内。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/color-fill-lcci

解题思路

这道题目是我按标签顺着找的,所以直接就能顺着深度优先搜索(dfs)的思想去想。
其实看到提干描述还是挺亲切的,学了一年多图像,虽然都只是调调函数调调参,但是这些关于图像描述的算法看到还是挺熟悉的。
很像是查找连通域里面的一步,从函数名也可以看到是floodfill,漫水填充。

dfs的思路就不多说了,最主要的是学会拆分题目,想好每一步要做什么,以及终止的条件。

这里终止的条件比较明显,一个是图像矩阵的边界,一个是不满足连通的要求。这里的连通就是题目里描述的四领域里有相同的值,这里拆解为dfs,所以不考虑邻域,就考虑值是否相等。

然后就是dfs拆解出来的实现检查四邻域。

代码(C++)

class Solution {
public:

    void dfs(vector<vector<int>>& image,int i,int j,int oldColor,int newColor){

        if(i>=image.size()||j>=image[0].size()||i<0||j<0) return;
        if(image[i][j]!=oldColor) return;

        if(image[i][j]==oldColor){
            image[i][j]=newColor;
            dfs(image,i+1,j,oldColor,newColor);
            dfs(image,i,j+1,oldColor,newColor);
            dfs(image,i-1,j,oldColor,newColor);
            dfs(image,i,j-1,oldColor,newColor);
        }
    }
    
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
    
        int oldColor=image[sr][sc];
        
        if(oldColor!=newColor){
            dfs(image,sr,sc,oldColor,newColor);
        }
             
        return image;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值