Solución de rotación de matriz cuadrada (48)

tema

Se le proporciona una N × Nimagen representada por una matriz donde cada píxel tiene un tamaño de 4 bytes. Diseñe un algoritmo para rotar la imagen 90 grados.

¿Se puede hacer sin ocupar espacio extra en la memoria?

Ejemplo 1:

给定 matrix = 
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
],

原地旋转输入矩阵,使其变为:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]

Ejemplo 2:

给定 matrix =
[
  [ 5, 1, 9,11],
  [ 2, 4, 8,10],
  [13, 3, 6, 7],
  [15,14,12,16]
], 

原地旋转输入矩阵,使其变为:
[
  [15,13, 2, 5],
  [14, 3, 4, 1],
  [12, 6, 8, 9],
  [16, 7,10,11]
]

analizar

La forma de matriz dada es una N x Nmatriz cuadrada, por lo que se conocen su ancho y alto , y se Nrequiere el 90grado de rotación, luego 横向排列se cambiará la matriz 竖向排列y también se cambiará el método de llenado 倒序填充.

Como se muestra en la imagen:

inserte la descripción de la imagen aquí

Después de la conversión, el subíndice horizontal se convierte en el subíndice vertical en orden inverso. La fórmula es:横向index = 竖向N-1-index

el código

Es muy simple si permite que una matriz vacía acepte, complejidad del tiempo: O(n²)complejidad del espacio:O(2n)

    public void rotate(int[][] matrix) {
    
    
        int[][] result = new int[matrix.length][matrix.length];
        for (int i = 0; i < matrix.length; i++) {
    
    
            int now[] = matrix[i];
            // 计算旋转后下标
            int index = matrix.length-1-i;
            for (int j = 0; j < now.length; j++) {
    
    
                result[j][index] = now[j];
            }
        }
    }

El título también requiere tratar de no adaptarse al espacio adicional, por lo que la matriz temporal no se puede usar y debe rotarse dentro de la matriz dada, es decir; complejidad del tiempo: 原地旋转complejidad O(n²)del espacio:O(1)

Girar in situ cubrirá una parte del valor, por lo que el valor sobrescrito también debe almacenarse. Si el ajuste de superposición se realiza directamente en la línea anterior, se generarán demasiados valores de superposición, por lo que es necesario ajustar el valores uno por uno hasta la posición correcta. Ajuste desde el primer dígito de cada línea.

inserte la descripción de la imagen aquí

El código se muestra a continuación:

    public void rotate(int[][] matrix) {
    
    
        int length = matrix.length;
        for (int i = 0; i < matrix.length/2; i++) {
    
    
            for (int j = i; j < matrix.length - (i + 1); j++) {
    
    
                int temp = matrix[i][j];
                matrix[i][j] = matrix[length - j-1][i];
                matrix[length - j -1][i] = matrix[length-i-1][length-j-1];
                matrix[length-i-1][length-j-1] = matrix[j][length-i-1];
                matrix[j][length-i-1] = temp;
            }
        }
    }

Hay otra forma, 正方形旋转90°= 正方形水平反转+ 对角线反转; complejidad temporal: O(n²)complejidad espacial:O(1)

inserte la descripción de la imagen aquí

El código se muestra a continuación:

    public void rotate(int[][] matrix) {
    
    
        int n = matrix.length;
        // 水平翻转
        for (int i = 0; i < n / 2; ++i) {
    
    
            for (int j = 0; j < n; ++j) {
    
    
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - i - 1][j];
                matrix[n - i - 1][j] = temp;
            }
        }
        // 主对角线翻转
        for (int i = 0; i < n; ++i) {
    
    
            for (int j = 0; j < i; ++j) {
    
    
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
    }

Supongo que te gusta

Origin blog.csdn.net/AnNanDu/article/details/126740146
Recomendado
Clasificación