LeetCode 48:旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。要求将图像顺时针旋转 90 度。关键点在于原地旋转,即直接修改输入的二维矩阵,不能使用另一个矩阵来存储结果。
解决这道题最直观且不易出错的方法是利用矩阵变换的数学性质:对角线翻转 + 左右翻转。下面通过数学原理、步骤拆解和代码细节为你详细分析。
1. 数学原理
我们要实现的是:坐标 $(i, j)$ 的元素,旋转 90 度后,应该去哪里?根据坐标变换公式,顺时针旋转 90 度后的位置是:$(j, n - 1 - i)$。
直接实现这个变换比较复杂,但我们可以将其分解为两步简单的几何变换:
- 主对角线翻转(矩阵转置): 将 $(i, j)$ 变为 $(j, i)$。此时,行变成了列。
- 左右镜像翻转: 将 $(j, i)$ 变为 $(j, n - 1 - i)$。此时,每一行的元素顺序颠倒。
结论: $(i, j) \xrightarrow{转置} (j, i) \xrightarrow{左右翻转} (j, n - 1 - i)$。这刚好完成了顺时针 90 度旋转。
2. 步骤拆解(以 3x3 矩阵为例)
假设原始矩阵如下:
1 2 3
4 5 6
7 8 9
第一步:沿主对角线翻转
主对角线就是从左上角到右下角的这条线(1, 5, 9)。我们将对角线两侧的元素进行两两交换:
- 2 和 4 交换
- 3 和 7 交换
- 6 和 8 交换
变化后的矩阵:
1 4 7
2 5 8
3 6 9
此时观察:原来的第一行 [1,2,3] 变成了现在的第一列。
第二步:每一行左右镜像翻转
对每一行进行反转(Reverse):
- 第一行 [1, 4, 7] 变成 [7, 4, 1]
- 第二行 [2, 5, 8] 变成 [8, 5, 2]
- 第三行 [3, 6, 9] 变成 [9, 6, 3]
变化后的矩阵:
7 4 1
8 5 2
9 6 3
结果完成!这正是原矩阵顺时针旋转 90 度后的样子。
3. 代码实现细节(Java 示例)
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
// 1. 沿主对角线翻转
// 注意:j 从 i + 1 开始,只处理右上半部分,避免重复交换
for (int i ; i < n; i++) {
( i + ; j < n; j++) {
matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
( ; i < n; i++) {
( ; j < n / ; j++) {
matrix[i][j];
matrix[i][j] = matrix[i][n - - j];
matrix[i][n - - j] = temp;
}
}
}
}


