不要看官方题解的数学题,直接看“做你爱吃的唐僧肉”的题解,这位大佬的解法算是比较易懂了。
public void rotate(int[][] matrix) {
int pos1 = 0, pos2 = matrix.length - 1;
//想像一个4x4的矩形,四个角的坐标为(pos1, pos1) (pos1, pos2)
// (pos2, pos1) (pos2, pos2)
// 即(0, 0) (0, 3)
// (3, 0) (3, 3)
int add = 0; //偏移量add使矩阵在每一层内顺时针旋转,比如说(0, 0)移动完了到(0, 1)移动,
//所以左上角的坐标是(pos1, pos1 + add)
while (pos1 < pos2) {
add = 0;
while (add < pos2 - pos1) {
//要注意,如果将temp设置为左下角的元素,那么必须从右下角的元素开始顺时针移动,
//如果从其他位置的元素开始移动,比如右上角移到右下角,那么右下角的就被覆盖了,
//要从符合顺时针旋转的、temp的上一个最近元素开始移动
//注意坐标里add的加减
//保存temp为左下角
int temp = matrix[pos2 - add][pos1];
//右下移到左下
matrix[pos2 - add][pos1] = matrix[pos2][pos2 - add];
//右上移到右下
matrix[pos2][pos2 - add] = matrix[pos1 + add][pos2];
//左上移到右上
matrix[pos1 + add][pos2] = matrix[pos1][pos1 + add];
//左下移到左上
matrix[pos1][pos1 + add] = temp;
//移动下一格子
add += 1;
}
//移动下一层
pos1 += 1;
pos2 -= 1;
}
}