跳至主要內容

面试题 08.10. 颜色填充

ITCharge大约 2 分钟

面试题 08.10. 颜色填充open in new window

  • 标签:深度优先搜索、广度优先搜索、数组、矩阵
  • 难度:简单

题目链接

题目大意

给定一个二维整数矩阵 image,其中 image[i][j] 表示矩阵第 i 行、第 j 列上网格块的颜色值。再给定一个起始位置 (sr, sc),以及一个目标颜色 newColor

要求:对起始位置 (sr, sc) 所在位置周围区域填充颜色为 newColor。并返回填充后的图像 image

  • 周围区域:颜色相同且在上、下、左、右四个方向上存在相连情况的若干元素。

解题思路

深度优先搜索。使用二维数组 visited 标记访问过的节点。遍历上、下、左、右四个方向上的点。如果下一个点位置越界,或者当前位置与下一个点位置颜色不一样,则对该节点进行染色。

在遍历的过程中注意使用 visited 标记访问过的节点,以免重复遍历。

代码

class Solution:
    directs = [(0, 1), (0, -1), (1, 0), (-1, 0)]

    def dfs(self, image, i, j, origin_color, color, visited):
        rows, cols = len(image), len(image[0])

        for direct in self.directs:
            new_i = i + direct[0]
            new_j = j + direct[1]

            # 下一个位置越界,则当前点在边界,对其进行着色
            if new_i < 0 or new_i >= rows or new_j < 0 or new_j >= cols:
                image[i][j] = color
                continue

            # 如果访问过,则跳过
            if visited[new_i][new_j]:
                continue

            # 如果下一个位置颜色与当前颜色相同,则继续搜索
            if image[new_i][new_j] == origin_color:
                visited[new_i][new_j] = True
                self.dfs(image, new_i, new_j, origin_color, color, visited)
            # 下一个位置颜色与当前颜色不同,则当前位置为连通区域边界,对其进行着色
            else:
                image[i][j] = color

    def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]:
        if not image:
            return image

        rows, cols = len(image), len(image[0])
        visited = [[False for _ in range(cols)] for _ in range(rows)]
        visited[sr][sc] = True

        self.dfs(image, sr, sc, image[sr][sc], newColor, visited)

        return image