题目:
编写函数,实现许多图片编辑软件都支持的「颜色填充」功能。
待填充的图像用二维数组 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)。