Leetcode—旋转矩阵

发布时间 2023-12-20 17:29:35作者: 吧拉吧拉吧

给定一个 × 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. 根据示例1,第一行: 0,0->0,2;0,1->1,2;0,2->2,2。第二行:1,0->0,1;1,1->1,1;1,2->2,1。第三行:2,0->0,0;2,1->1,0;2,2->2,0。可以得出结论旋转后的列数=n-行数;旋转后的行数=列数。再套入示例二仍然正确。
  2. 题目要求原地旋转,咱们可以借助辅助矩阵转换,先将转换后的矩阵赋值给辅助矩阵temp,在输出的时候将辅助矩阵换回matrix,同时按要求输出矩阵。

代码实现:

class Solution {
    public void rotate(int[][] matrix) {
        int n= matrix.length;
        int[][] temp=new int[n][n]; 
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                temp[j][n-1-i]=matrix[i][j];
            }
        }
        System.out.printf("[");
        for(int i=0;i<n;i++){
            System.out.printf("[");
            for(int j=0;j<n;j++){
                matrix[i][j]=temp[i][j];
                System.out.print(matrix[i][j]);
                if(j!=n-1){
                    System.out.printf(",");
                }
            }
            System.out.printf("]");
        }
        System.out.printf("]");
    }
}

 

代码优化:

  前面的代码时间复杂度和空间复杂度都是O(N^2),有优化的空间。于是我们再分析,发现可以不依靠辅助矩阵,通过两次翻转实现原地翻转,先上下水平对称翻转,再由主对角线对称翻转,同样可以得到旋转90°后的矩阵。空间复杂度变为O(1)

优化后代码:

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        int temp;
        // 按水平翻转
        for (int i = 0; i < n / 2; i++) {
            for (int j = 0; j < n; j++) {
                temp = matrix[i][j];
                matrix[i][j] = matrix[n - i - 1][j];
                matrix[n - i - 1][j] = temp;
            }
        }
        // 按主对角线翻转
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < i; j++) {
                temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
    }
}