tema
Se le proporciona una N × N
imagen 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 N
matriz cuadrada, por lo que se conocen su ancho y alto , y se N
requiere el 90
grado de rotación, luego 横向排列
se cambiará la matriz 竖向排列
y también se cambiará el método de llenado 倒序填充
.
Como se muestra en la imagen:
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.
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)
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;
}
}
}