LeetCode48, cómo rotar la matriz 90 grados en su lugar

Este artículo se originó en una cuenta pública personal: TechFlow , el original no es fácil, busca atención


Hoy es el 29 de LeetCode. Veamos un problema simple de rotación de matrices.

Titulo

El requisito del problema es muy simple: dada una matriz cuadrada bidimensional, es necesario devolver el resultado después de que la matriz se gira 90 grados .

A continuación vemos dos ejemplos:

Solución

Esta animación es clara de un vistazo, lo que significa que necesitamos rotar una matriz bidimensional 90 grados en el sentido de las agujas del reloj. Todos entendemos esta pregunta muy bien, pero hay una limitación en la pregunta: no podemos solicitar otros arreglos para ayudar , lo que es limitar nuestra utilización del espacio.

Si no existe tal restricción, en realidad es muy fácil, solo necesitamos calcular la posición después de cada rotación de coordenadas, recreamos una matriz y la llenamos en orden.

Ignoramos los datos específicos en la matriz y observamos los cambios de coordenadas antes y después de la rotación de la matriz. Estas son las coordenadas antes de la rotación de la matriz:

Después de la rotación, las coordenadas se convierten en:

Mirando las dos imágenes de arriba, podemos ver que para la coordenada (i, j), el resultado obtenido después de girarlo 90 grados debería ser (j, n-1-i). Aquí n es el número de filas.

Después de tener esta fórmula, podemos continuar promocionándola. Encontramos que el punto en la posición (i, j) alcanzó (j, n-1-i) después de la rotación. Y el punto en la posición (j, n-1-i) se gira a (n-1-i, n-1-j), y de la misma manera (n-1-i, n-1-j) se gira a (n -1-j, i), y finalmente encontramos que (n-1-j, i) regresó a (i, j) después de la rotación.

Eso es para una rotación, (i, j), ( j, n-1-i), (n-1-i, n-1-j), (n-1-j, i) cuatro Los elementos en esta posición intercambiaron posiciones entre sí y no afectaron otras posiciones. De hecho, esto también es muy fácil de entender, porque el problema viene dado por una matriz cuadrada.

Entendemos mirando la siguiente imagen:

En otras palabras, solo necesitamos atravesar una cuarta parte de la matriz , y luego obtener las 4 posiciones que se intercambian a través de las coordenadas, y luego intercambiar sus elementos.

Código

El código es realmente simple, solo unas pocas líneas:

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """

        n = len(matrix)
        
        # 注意一下范围和下标即可
        for i in range(n//2):
            for j in range(i, n-1-i):
                matrix[i][j], matrix[j][n-1-i], matrix[n-1-i][n-1-j], matrix[n-1-j][i] = \
                matrix[n-1-j][i], matrix[i][j], matrix[j][n-1-i], matrix[n-1-i][n-1-j]

El artículo de hoy es solo eso. Si siente algo recompensado, sígalo o vuelva a publicarlo . Su esfuerzo es muy importante para mí.

117 artículos originales publicados · Me gusta 61 · Visitas 10,000+

Supongo que te gusta

Origin blog.csdn.net/TechFlow/article/details/105475070
Recomendado
Clasificación