// 因此可以使用一个同样大小的二维数组, 存储翻转后的结果, 然后再复制回去
int
[]
[]
temp
= new int[matrix.length][matrix[
0
].length]
for (int
i
=
0
for (int
j
=
0
// 现在的列索引就是temp的行索引
// temp的列索引是固定的和当前i有关
temp
[j]
[matrix[0]
.length - i - 1] = matrix
[i]
[j]
// 将临时数组中的元素拷贝回去
for (int
i
=
0
for (int
j
=
0
matrix
[i]
[j]
= temp
[i]
[j]
正确的原因
(1) 观测到第一行元素, 变成最后一列, 第二行元素, 变成倒数第二列
(2) 然后就可以找到翻转前后的索引关系.
版本2 正确 不使用额外空间, 推导出旋转180度, 旋转270度的情况
public void rotate(int[][] matrix) {
// 将二维数组中的图像, 顺时针旋转90度
// 顺时针旋转90度, 相当于先把数组水平方向翻转(即上下两部分元素交换), 然后再按照左上到右下的对角线翻转
// 顺时针旋转180度, 相当于先把数组先水平方向翻转, 然后再按垂直方向翻转(即左右两部分元素交换)
// 顺时针旋转270, 即逆时针旋转90度, 相当于先把数组垂直方向翻转, 然后再按左上到右下的对角线翻转
// 水平翻转
for(int i = 0
for (int j = 0
int temp = matrix[i][j]
matrix[i][j] = matrix[matrix.length - 1 - i][j]
matrix[matrix.length - 1 - i][j] = temp
// 按照左上到右下的对角线翻转
// 因为是n * n的二维数组, 不用担心按照对角线翻转后的数组越界问题
for (int i = 0
for (int j = 0
if (j > i) {
// 代表对角线的上半部分
int temp = matrix[i][j]
matrix[i][j] = matrix[j][i]
matrix[j][i] = temp
正确的原因