关键方法是先沿主对角线翻转再每行水平翻转,两次操作使matrixi移至j,实现原地顺时针旋转90°,仅用常数额外空间。

在 Java 中实现矩阵顺时针旋转 90 度并保持原地(O(1) 额外空间)的关键是:先沿主对角线翻转,再每行水平翻转。该方法不依赖额外数组,仅用常数个临时变量。
核心思路:两次翻转等价于 90° 顺时针旋转
对于一个 n×n 的方阵:
- 第一步:沿主对角线(从左上到右下)镜像翻转 —— 即交换 matrix[i][j] 与 matrix[j][i],其中 j > i
- 第二步:每行左右翻转(水平反转) —— 即对每一行,交换第 j 列与第 (n−1−j) 列元素
两次操作叠加后,原 matrix[i][j] 会落到位置 [j][n−1−i],正好是顺时针旋转 90° 后的坐标。
Java 实现代码(原地、无额外数组)
以下为完整可运行逻辑(假设输入为 n×n 二维数组):
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
public static void rotate(int[][] matrix) {
int n = matrix.length;
<pre class="brush:php;toolbar:false;">// 步骤1:沿主对角线翻转(上三角部分)
for (int i = 0; i <p>}</p>为什么空间复杂度是 O(1)?
整个过程只使用了固定数量的局部变量(如 i、j、n、temp),未创建新数组、未递归调用、未使用栈或队列。所有修改均在原 matrix 引用所指向的内存中完成,符合“原地”要求。
注意事项与常见误区
- 仅适用于方阵:该算法要求 matrix.length == matrix[0].length;矩形矩阵(m×n, m≠n)无法原地旋转 90°(结果维度变为 n×m,必须分配新数组)
- 逆时针 90° 可改用副对角线 + 水平翻转,或重复三次顺时针旋转(效率低,不推荐)
- 边界索引别越界:主对角线翻转时内层循环从 j = i+1 开始;水平翻转时只需遍历前半行(j
- 不要混淆坐标变换公式:顺时针 90° 后,(i,j) → (j, n−1−i),不是 (n−1−j, i) 或其他形式
该方法简洁高效,时间复杂度 O(n²),空间复杂度严格 O(1),是面试与基础算法中旋转矩阵的标准解法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










