Leikou Brushing Notes: 733. Representación de imágenes (primero en amplitud, primero en profundidad, código fácil de entender, código de solución completo y comentarios)

tema:

Capítulo 733: Representación de imágenes

Hay una imagen representada por una matriz de números enteros bidimensionales. Cada número entero representa el valor de píxel de la imagen, y el valor está entre 0 y 65535.

Le da una coordenada (sr, sc) que representa el valor de píxel (fila, columna) en el que se renderiza la imagen y un nuevo valor de color newColor, lo que le permite volver a colorear la imagen.

Para completar el trabajo de coloración, a partir de las coordenadas iniciales, registre los píxeles conectados con el mismo valor de píxel que las coordenadas iniciales en las cuatro direcciones de las coordenadas iniciales, y luego registre los cuatro píxeles que cumplen las condiciones en estas cuatro direcciones. y sus cuatro correspondientes Los píxeles conectados con el mismo valor de píxel que la coordenada inicial en la dirección, ..., repita el proceso. Cambie el valor de color de todos los píxeles grabados al nuevo valor de color.

Finalmente, vuelve a la imagen renderizada después de colorear.

Ejemplo 1:

Entrada:
imagen = [[1,1,1], [1,1,0], [1,0,1]]
sr = 1, sc = 1, newColor = 2
Salida: [[2,2,2] , [2,2,0], [2,0,1]]
Análisis:
en el medio de la imagen, (coordenadas (sr, sc) = (1,1)),
todos los píxeles elegibles en la ruta Los colores tienen se ha cambiado a 2.
Tenga en cuenta que el píxel de la esquina inferior derecha no se cambia a 2
porque no es un píxel conectado al punto inicial en las cuatro direcciones arriba, abajo, izquierda y derecha.

Nota:

La longitud de la imagen y la imagen [0] está en el rango [1, 50].
El punto inicial dado satisfará 0 <= sr <image.length y 0 <= sc <image [0] .length.
Los valores de color representados por image [i] [j] y newColor están en el rango [0, 65535].

Ideas de solución de problemas:

Esta pregunta requiere teñir el "bloque de color" especificado en una matriz bidimensional dada en otro color. La definición de "bloque de color" es: el conjunto formado por cuadrados directa o indirectamente adyacentes del mismo color.

Se puede encontrar que el "bloque de color" es una isla del mismo color rodeada de cuadrados de diferentes colores. Comenzamos desde cualquier lugar del bloque de color y usamos la búsqueda en amplitud o la búsqueda en profundidad para recorrer toda la isla.

Nota: cuando el color de destino es el mismo que el color inicial, no es necesario modificar la matriz original.

método uno:

Amplitud primera búsqueda

Partimos de un punto de partida determinado y realizamos una búsqueda en amplitud. Cada vez que se busca un cuadrado, si es del mismo color que el cuadrado en la posición inicial, el cuadrado se agrega a la cola y el color del cuadrado se actualiza para evitar la entrada repetida en la cola.

Nota: Debido a que se modificará el color de la posición inicial, debemos guardar el color de la posición inicial para operaciones de actualización posteriores.

Análisis de complejidad

Complejidad de tiempo: O (n × m), donde nym son el número de filas y columnas de una matriz bidimensional, respectivamente. En el peor de los casos, es necesario atravesar todos los cuadrados una vez.

Complejidad espacial: O (n × m), donde nym son el número de filas y columnas de una matriz bidimensional, respectivamente. Principalmente la sobrecarga de la cola.

Código Python de la solución del problema:

class Solution:
    def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]:
        currColor = image[sr][sc]
        if currColor == newColor:
            return image
        
        n, m = len(image), len(image[0])
        que = collections.deque([(sr, sc)])
        image[sr][sc] = newColor
        while que:
            x, y = que.popleft()
            for mx, my in [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]:
                if 0 <= mx < n and 0 <= my < m and image[mx][my] == currColor:
                    que.append((mx, my))
                    image[mx][my] = newColor
        
        return image

Método dos:

Profundidad primera búsqueda

Partimos de un punto de partida determinado y realizamos una búsqueda en profundidad. Cada vez que se busca un cuadrado, si es del mismo color que el cuadrado en la posición inicial, se actualiza el color del cuadrado para evitar búsquedas repetidas; si no es el mismo, se realiza un retroceso.

Nota: Debido a que se modificará el color de la posición inicial, debemos guardar el color de la posición inicial para operaciones de actualización posteriores.

Análisis de complejidad

Complejidad de tiempo: O (n \ times m) O (n × m), donde nn y mm son el número de filas y columnas de una matriz bidimensional, respectivamente. En el peor de los casos, es necesario atravesar todos los cuadrados una vez.

Complejidad espacial: O (n \ times m) O (n × m), donde nn y mm son el número de filas y columnas de una matriz bidimensional, respectivamente. Principalmente la sobrecarga del espacio de la pila.

Código Python de la solución del problema:

class Solution:
    def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]:
        n, m = len(image), len(image[0])
        currColor = image[sr][sc]

        def dfs(x: int, y: int):
            if image[x][y] == currColor:
                image[x][y] = newColor
                for mx, my in [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]:
                    if 0 <= mx < n and 0 <= my < m and image[mx][my] == currColor:
                        dfs(mx, my)

        if currColor != newColor:
            dfs(sr, sc)
        return image

Autor: LeetCode-Solution
Links: https://leetcode-cn.com/problems/flood-fill/solution/tu-xiang-xuan-ran-by-leetcode-solution/
Fuente: botón de estancia (LeetCode) HTTPS: // leetcode-cn.com/problems/flood-fill/

Supongo que te gusta

Origin blog.csdn.net/weixin_44414948/article/details/113743925
Recomendado
Clasificación