方法一:重新开辟一个数组用来辅助

对数组进行顺时针 90° 旋转,总结出的规律就是:第 i 行的第 j 个元素变为 倒数第 i 列的第 j 个元素所在位置。

转成代码为:

matrix[row][col] 旋转 90 °后新位置为 matrixRot[col][matrix.length - 1 - row]

代码如下:

class Solution {
    public void rotate(int[][] matrix) {
        int[][] matrixRot = new int[matrix.length][matrix[0].length];
        for(int i = 0; i < matrix.length; i++){
            for(int j = 0; j < matrix[0].length; j++){
                matrixRot[j][matrix.length - 1 - i] = matrix[i][j];
            }
        }
        for(int i = 0; i < matrix.length; i++){
            for(int j = 0; j < matrix[0].length; j++){
                matrix[i][j] = matrixRot[i][j];
            }
        }

    }
}

时间复杂度为 O(N2),空间复杂度为 O(N2)

方法二:原地旋转

如果不能创建辅助矩阵如何解题?经过分析:矩阵顺时针旋转90°,实际上就是对数组进行 转置 + 竖轴翻转

代码如下:

class Solution {
    public void rotate(int[][] matrix) {
        //转置
        for(int i = 0; i < matrix.length; i++){
            for(int j = 0; j < i; j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }

        //竖轴翻转
        for(int i = 0; i < matrix.length; i++){
            for(int j = 0; j < matrix.length / 2; j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[i][matrix.length - 1 - j];
                matrix[i][matrix.length - 1 - j] = temp;
            }
        }

    }
}

时间复杂度为 O(N2),空间复杂度为 O(1)。

Categories:

Tags:

No responses yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注