The problem description for Flood Fill on LeetCode is as follows:
An image is represented by an m x n
integer grid image
where image[i][j]
represents the pixel value of the image.
You are also given three integers sr
, sc
, and newColor
. You should perform a flood fill on the image starting from the pixel image[sr][sc]
.
To perform a flood fill, consider the starting pixel, plus any pixels connected 4-directionally to the starting pixel of the same color as the starting pixel, plus any pixels connected 4-directionally to those pixels (also with the same color as the starting pixel), and so on. Replace the color of all of the aforementioned pixels with newColor
.
Return the modified image after performing the flood fill.
Example 1:
Input: image = [[1,1,1],[1,1,0],[1,0,1]], sr = 1, sc = 1, newColor = 2
Output: [[2,2,2],[2,2,0],[2,0,1]]
Explanation: From the center of the image (with position (sr, sc) = (1, 1)), all pixels connected by a path of the same color as the starting pixel are colored with the new color.
Note the bottom corner is not colored 2, because it is not 4-directionally connected to the starting pixel.
Example 2:
Input: image = [[0,0,0],[0,0,0]], sr = 0, sc = 0, newColor = 2
Output: [[2,2,2],[2,2,2]]
Constraints:
m == image.length
n == image[i].length
1 <= m, n <= 50
0 <= image[i][j], newColor < 2^16
image[sr][sc]
is already equal to newColor
, no changes should be made to avoid infinite loops.We can solve this problem using Depth-First Search (DFS) or Breadth-First Search (BFS). Here’s a high-level plan for using DFS:
image[sr][sc]
is already newColor
, return the image as is.Here is the Java implementation of the Flood Fill algorithm using DFS:
public class Solution {
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
int origColor = image[sr][sc];
if (origColor != newColor) {
dfs(image, sr, sc, origColor, newColor);
}
return image;
}
private void dfs(int[][] image, int i, int j, int origColor, int newColor) {
if (i < 0 || i >= image.length || j < 0 || j >= image[0].length || image[i][j] != origColor) {
return;
}
// Change the color
image[i][j] = newColor;
// Explore the neighbors (up, down, left, right)
dfs(image, i - 1, j, origColor, newColor);
dfs(image, i + 1, j, origColor, newColor);
dfs(image, i, j - 1, origColor, newColor);
dfs(image, i, j + 1, origColor, newColor);
}
}
This code ensures that all applicable pixels are updated while avoiding unnecessary modifications if the starting pixel is already newColor
.
Got blindsided by a question you didn’t expect?
Spend too much time studying?
Or simply don’t have the time to go over all 3000 questions?