友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

733. 图像渲染

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

为了完成 上色工作

  1. 从初始像素开始,将其颜色改为 color

  2. 对初始坐标的 上下左右四个方向上 相邻且与初始像素的原始颜色同色的像素点执行相同操作。

  3. 通过检查与初始像素的原始颜色相同的相邻像素并修改其颜色来继续 重复 此过程。

  4. 没有 其它原始颜色的相邻像素时 停止 操作。

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

示例 1:

0733 01

输入:image = [[1,1,1],[1,1,0],[1,0,1]],sr = 1, sc = 1, color = 2

输出:[[2,2,2],[2,2,0],[2,0,1]]

解释:在图像的正中间,坐标 (sr,sc)=(1,1) (即红色像素),在路径上所有符合条件的像素点的颜色都被更改成相同的新颜色(即蓝色像素)。

注意,右下角的像素 没有 更改为2,因为它不是在上下左右四个方向上与初始点相连的像素点。

示例 2:

输入:image = [[0,0,0],[0,0,0]], sr = 0, sc = 0, color = 0

输出:[[0,0,0],[0,0,0]]

解释:初始像素已经用 0 着色,这与目标颜色相同。因此,不会对图像进行任何更改。

提示:

  • m == image.length

  • n == image[i].length

  • 1 <= m, n <= 50

  • `0 <= image[i][j], color < 216

  • 0 <= sr < m

  • 0 <= sc < n

思路分析

深度优先遍历。

  • 一刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2026-06-01 23:27:26
 */
public int[][] floodFill(int[][] image, int sr, int sc, int color) {
  int origin = image[sr][sc];
  if (origin == color) {
    return image;
  }
  dfs(image, sr, sc, color, origin);
  return image;
}

private void dfs(int[][] image, int r, int c, int color, int origin) {
  if (r < 0 || image.length <= r
    || c < 0 || image[r].length <= c
    || image[r][c] != origin) {
    return;
  }
  image[r][c] = color;
  // 上
  dfs(image, r - 1, c, color, origin);
  // 下
  dfs(image, r + 1, c, color, origin);
  // 左
  dfs(image, r, c - 1, color, origin);
  // 右
  dfs(image, r, c + 1, color, origin);
}