力扣面试题 08.10. 颜色填充 C语言解法 深度优先 数组 矩阵

题目:

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

待填充的图像用二维数组 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] 内。

思路:

  • 采用深度优先的思路。先判断原始颜色与目标颜色是否相同,如果相同那么不需要填充。
  • 使用visited数组记录已经填充过的地方,防止重复填充。
  • 先填充目标位置,再填充周围区域。然后再填充周围区域的周围区域,直到周围没有能填充的地方。即得解。

C代码如下:

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */

void dfs(int** image, int imageSize, int* imageColSize, int sr, int sc, int newColor, int val, int** visited) {
    if (sr < 0 || sr >= imageSize || sc < 0 || sc >= *imageColSize || image[sr][sc] != val || visited[sr][sc]) return;
    image[sr][sc] = newColor;
    visited[sr][sc] = 1;
    dfs(image, imageSize, imageColSize, sr, sc - 1, newColor, val, visited);
    dfs(image, imageSize, imageColSize, sr, sc + 1, newColor, val, visited);
    dfs(image, imageSize, imageColSize, sr - 1, sc, newColor, val, visited);
    dfs(image, imageSize, imageColSize, sr + 1, sc, newColor, val, visited);
}

int** floodFill(int** image, int imageSize, int* imageColSize, int sr, int sc, int newColor, int* returnSize, int** returnColumnSizes) {
    int val = image[sr][sc];
    if(val == newColor) {  // 如果原始颜色与目标颜色一样,那么不需要填充
        *returnSize = imageSize;
        *returnColumnSizes = imageColSize;
        return image;
    }
    int** visited = (int**)malloc(imageSize * sizeof(int*));
    for(int i = 0; i < imageSize; i++) {
        visited[i] = (int*)calloc(*imageColSize, sizeof(int));
    }
    dfs(image, imageSize, imageColSize, sr, sc, newColor, val, visited);
    *returnSize = imageSize;
    *returnColumnSizes = imageColSize;
    for(int i = 0; i < imageSize; i++) {
        free(visited[i]);
    }
    free(visited);
    return image;
}

时间、空间复杂度均为O(N^2)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值