FloodFill 算法的核心思想其实很直观,就像洪水蔓延一样,从一个点出发,向四周扩散,把连通且满足条件的区域全部覆盖。在图论和网格问题中,这通常对应着广度优先搜索(BFS)或深度优先搜索(DFS)。
733. 图像渲染
这道题是 FloodFill 最经典的入门应用。给定一个二维数组表示的图像,以及起始坐标和新颜色,要求将与起始点相连且颜色相同的像素全部修改为新颜色。
思路解析
本质上就是遍历所有与起点相连的同色像素。我们可以利用队列来存储待处理的坐标。每次取出一个坐标,检查其上下左右四个方向,如果邻居合法、颜色相同且未被处理过,就将其加入队列并修改颜色。
这里有个细节要注意:如果起始点的颜色本身就是目标颜色,直接返回原数组即可,避免无效操作。另外,边界检查必不可少,防止数组越界。
// 时间复杂度:O(N),空间复杂度:O(N)
class Solution {
public int[][] floodFill(int[][] image, int sr, int sc, int color) {
// 记录开始颜色
int pre = image[sr][sc];
// 如果初始颜色就是目标颜色,无需处理
if (pre == color) return image;
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{sr, sc});
while (!queue.isEmpty()) {
int[] cur = queue.poll();
int x = cur[0];
int y = cur[1];
// 检查上下左右四个方向
int[] dx = {0, 0, 1, -1};
int[] dy = {1, -1, 0, };
( ; i < ; i++) {
x + dx[i];
y + dy[i];
(nx >= && nx < image.length &&
ny >= && ny < image[].length &&
pre == image[nx][ny]) {
image[nx][ny] = color;
queue.add( []{nx, ny});
}
}
}
image;
}
}


