You are given an n x n 2D matrix representing an image.
Rotate the image by 90 degrees (clockwise).
Note:
You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and do the rotation.
Example 1:
Given input matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
rotate the input matrix in-place such that it becomes:
[7,4,1],
[8,5,2],
[9,6,3]
]
Example 2:
Given input matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
rotate the input matrix in-place such that it becomes:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
矩阵旋转的问题,顺时针旋转90度
坐标的规律为 i , j -> j , 2-i
难点在于不能额外创建一个矩阵空间
思路不难,从外到内旋转交换坐标上的数即可
但是写代码的时候,零界点的判断真是废了好大劲
public void rotate(int[][] matrix) {
int row = matrix.length - 1;
for (int i = 0, j = 0; i <= row / 2; i++, j++) {
for (int ibegin = i, jbegin = j; jbegin <= row - ibegin; jbegin++) {
int tmpi = ibegin;
int tmpj = jbegin;
int nowi = ibegin;
int nowj = jbegin;
int tmp = matrix[nowi][nowj];
do {
int tmpTmp = matrix[nowj][row - nowi];
matrix[nowj][row - nowi] = tmp;
tmp = tmpTmp;
int tmpNowI = nowi;
nowi = nowj;
nowj = row - tmpNowI;
} while (nowi != tmpi || nowj != tmpj);
}
}
}
关于矩阵转置的其他方法:
1.首先以从对角线为轴翻转,然后再以x轴中线上下翻转即可得到结果
2.最后再来看一种方法,这种方法首先对原数组取其转置矩阵,然后把每行的数字翻转可得到结果,如下所示(其中蓝色数字表示翻转轴):
1 2 3 1 4 7 7 4 1
4 5 6 –> 2 5 8 –> 8 5 2
7 8 9 3 6 9 9 6 3