048J. Rotate Image

Method Best

如何旋转一个矩阵90度? 设想一个矩阵 n * n, 旋转90度相当于把他的 左上角 -> 右上角 -> 右下角 -> 左下角 -> 左上角 n 为偶数的时候,大矩阵可以分成四个小方阵。 n 为奇数的时候,矩阵可以分为中心的点和四个长比宽多1的长方形。 从左上的小矩阵开始循环,由于从0开始标记, 则一个边不超过 n/2.0, 或者说n/2向上取整; 一个边不超过 n/2, 或者说n/2向下取整; 举例,一个 3*3的矩阵, 1 2 3 4 5 6 7 8 9 我们取 1 2 或者 1 4 都行。 令 i,j 从0开始取值, 左上的坐标为 ( i , j ) 右上的坐标为 ( j , n - 1 - i) 左下的坐标为 (n - 1 - j, i ) 右下的坐标为 (n - 1 - i, n - 1 - j) 例: 3 3 1 4 4 3 3 2 4 4 1 2 0 2 1 6 6 2 5 5 6 6 1 5 5

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

这个题非常的神奇,我第一次做这个题的时候,是2019年的9月9日,就是上述的提交记录。彼时刚刚开始转码之路。 第二次做这个题的时候是2023年的9月9日,已然是整整四年之后,蹉跎岁月。

class Solution {
    public void rotate(int[][] matrix) {
        int N = matrix.length;
        int k = N - 1;
        for (int i = 0; i < (N + 1)/ 2; i++) {
            for (int j = 0; j < N / 2; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[k - j][i];
                matrix[k - j][i] = matrix[k - i][k - j];
                matrix[k - i][k - j] = matrix[j][k - i];
                matrix[j][k - i] = temp;
            }
        }
    }
   // k = N - 1,
   // (i, j) -> (j, k - i) -> (k - i, k - j) -> (k - j, i)
}

Last updated

Was this helpful?