原题:
英:
You are given an n x n 2D matrix representing an image.
Rotate the image by 90 degrees (clockwise).
Follow up:
Could you do this in-place?
中:
给定一个n×n的二维矩阵表示一个图像。
将图像旋转90度(顺时针)。
跟进:你能做到这一点吗?
解题思路:
这道题看起来在说图像旋转的问题,其实就是矩阵旋转的问题。
第一种是蛮力旋转的方法,如下所示:
1 2 3 7 4 1 A[0][0]->A[0][2] A[0][1]->A[1][2] A[0][2]->A[2][2]
4 5 6 --> 8 5 2 A[1][0]->A[0][1] A[1][1]->A[1][1] A[1][2]->A[2][1]
7 8 9 9 6 3 A[2][0]->A[0][0] A[2][1]->A[1][0] A[2][2]->A[2][0]
由此,对于n纬矩阵,总结规律为: A[i][j] -> A[j][n-1-i]
代码如下:
public class Solution {
public void rotate(int[][] matrix) {
int row = matrix.length;
int col = matrix[0].length;//其实row和col的值是一样的
int[][] res = new int[row][col];
for(int i=0; i<row;i++){
for(int j=0;j<col;j++){
res[j][col-1-i] = matrix[i][j];
}
}
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
matrix[i][j] = res[i][j];
}
}
}
}
第二种方法是用四个点进行旋转,从外围到里面,如下图所示:
1 2 3 7 2 1 7 4 1
4 5 6 --> 4 5 6 --> 8 5 2
7 8 9 9 8 3 9 6 3
① A[0][0]->A[0][2],A[2][0]->A[0][0],A[2][2]->A[2][0],A[0][2]->A[2][2]
② A[0][1]->A[1][2],A[1][0]->A[0][1],A[2][1]->A[1][0],A[1][2]->A[2][1]
代码如下:
public class Solution {
public void rotate(int[][] matrix){
int n = matrix.length;
for(int i=0; i<n/2; i++){
for(int j=i; j<n-1-i; j++){//从i开始取值,小于n-1-i终止,表示内层坐标
int tmp = matrix[j][n-1-i];//临时变量
matrix[j][n-1-i] = matrix[i][j];
matrix[i][j] = matrix[n-1-j][i];
matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
matrix[n-1-i][n-1-j] = tmp;
}
}
}
}
重点说明:
第一种方法虽然也能通过,但是与题意有些差别,属于投机取巧的做法。
第二种方法符合题意,但是在坐标之间的转换时要注意。而且,在for循环中i和j的取值范围也要注意。