Run depth-first search from the starting cell, recoloring only in-bounds neighbors with the original color. Return early when the new color already matches.
Complexity
O(rows * columns) time in the worst case and O(rows * columns) recursion space.
Recolor the connected component containing a starting image cell.
Run depth-first search from the starting cell, recoloring only in-bounds neighbors with the original color. Return early when the new color already matches.
O(rows * columns) time in the worst case and O(rows * columns) recursion space.
package main
func floodFill(image [][]int, sr int, sc int, color int) [][]int {
original := image[sr][sc]
if original == color {
return image
}
var visit func(int, int)
visit = func(row int, column int) {
if row < 0 || row >= len(image) || column < 0 || column >= len(image[0]) || image[row][column] != original {
return
}
image[row][column] = color
visit(row-1, column)
visit(row+1, column)
visit(row, column-1)
visit(row, column+1)
}
visit(sr, sc)
return image
}
class Solution:
def floodFill(self, image: list[list[int]], sr: int, sc: int, color: int) -> list[list[int]]:
original = image[sr][sc]
if original == color: return image
def visit(row: int, column: int) -> None:
if row < 0 or row == len(image) or column < 0 or column == len(image[0]) or image[row][column] != original: return
image[row][column] = color
visit(row - 1, column); visit(row + 1, column); visit(row, column - 1); visit(row, column + 1)
visit(sr, sc)
return image
function floodFill(image: number[][], sr: number, sc: number, color: number): number[][] {
const original = image[sr][sc];
if (original === color) return image;
const visit = (row: number, column: number): void => {
if (row < 0 || row >= image.length || column < 0 || column >= image[0].length || image[row][column] !== original) return;
image[row][column] = color;
visit(row - 1, column); visit(row + 1, column); visit(row, column - 1); visit(row, column + 1);
};
visit(sr, sc);
return image;
}