数组与哈希中等2 种解法

#48旋转图像

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

#数组#矩阵#原地修改

解题主线

01

坐标 (row, column) 旋转后变为 (column, n-1-row)。

02

先沿主对角线转置,再逐行反转,等价于顺时针旋转。

解法 1四点原地轮换

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

时间复杂度

O(n²)

空间复杂度

O(1)

48. 旋转图像 · 四点原地轮换
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²)

48. 旋转图像 · 辅助矩阵坐标映射
final class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        int[][] rotated = new int[n][n];
        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