原题
数组与哈希中等2 种解法

#48旋转图像

把 n×n 矩阵顺时针旋转 90 度,推荐原地完成。

#数组#矩阵#原地修改

原题

给定一个 × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]

示例 2:

输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

查看原题

解题主线

  1. 坐标 (row, column) 旋转后变为 (column, n-1-row)。
  2. 先沿主对角线转置,再逐行反转,等价于顺时针旋转。

解法 1:四点原地轮换

遍历左上区域,每次循环移动同一旋转轨道上的四个元素。

  • 时间复杂度: O(n²)

  • 空间复杂度: O(1)

JAVA
final class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        // 该遍历范围让每个四点旋转轨道恰好处理一次。
        for (int row = 0; row < n / 2; row++) {
            for (int column = 0; column < (n + 1) / 2; column++) {
                int temporary = matrix[row][column];
                // 按“左下→左上→右上→右下→左下”同步轮换,避免覆盖原值。
                matrix[row][column] = matrix[n - 1 - column][row];
                matrix[n - 1 - column][row] = matrix[n - 1 - row][n - 1 - column];
                matrix[n - 1 - row][n - 1 - column] = matrix[column][n - 1 - row];
                matrix[column][n - 1 - row] = temporary;
            }
        }
    }
}

解法 2:辅助矩阵坐标映射

把每个原元素写入旋转后的坐标,再整体复制回输入矩阵。

  • 时间复杂度: O(n²)

  • 空间复杂度: O(n²)

JAVA
final class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        int[][] rotated = new int[n][n];
        // 顺时针旋转的坐标映射为 (row, column) -> (column, n - 1 - row)。
        for (int row = 0; row < n; row++) {
            for (int column = 0; column < n; column++) {
                rotated[column][n - 1 - row] = matrix[row][column];
            }
        }
        // 映射完成后再整体写回,避免读取尚未处理的原矩阵元素时被覆盖。
        for (int row = 0; row < n; row++) {
            System.arraycopy(rotated[row], 0, matrix[row], 0, n);
        }
    }
}

实现提示

  • 保留旧文件中真实不同的辅助空间方案,但面试时优先原地解法。

边界与易错点

  • 直接四点轮换时行列下标很容易写反。
  • 辅助矩阵方案正确但不是题目要求的严格原地算法。

整理来源

由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。

  • medium/Q048_rotate.java