Loading...

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

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

示例 1:

img

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

示例 2:

img

输入: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  2  3  4
 *  5  6  7  8
 *  9 10 11 12
 * 13 14 15 16
 *
 * 第一次从 1 开始(1 (0,0) 到 (0,3),4 (0,3) 到 (3,3),16 (3,3) 到 (3,0),13 (3,0) 到 (0,0))回到起点则结束。
 * 每次都是由 (x, y) 到 (y, length - x),并且下次交换时更新 x 与 y,x = y, y = length - x,旋转为
 * 13  2  3  1
 *  5  6  7  8
 *  9 10 11 12
 * 16 14 15  4
 *
 * 第二次从 2 开始,同理旋转
 * 13  9  3  1
 *  5  6  7  2
 * 15 10 11 12
 * 16 14 8  4
 *
 * 第三次从 3 开始,同理旋转
 * 13  9  5  1
 * 14  6  7  2
 * 15 10 11  3
 * 16 12 8  4
 *
 * 第一层就结束了,第四次就从第二层开始
 * 6  7
 * 10 11
 * 从 6 开始,同理旋转
 * 10 6
 * 11 7
 *
 * @param matrix
 */
public static void rotate(int[][] matrix) {
    // 长度
    int length = matrix[0].length - 1;
    // 每一层
    for (int i = 0; i < matrix[0].length / 2; i++) {
        // 从 0,0 开始
        for (int j = i; j < length - i; j++) {
            // 当前坐标
            int x = i;
            int y = j;
            // 待更新的值
            int value = matrix[x][y];
            do {
                // 保留原值,并更新 (y, length - x) 坐标值
                // 下次将原值赋予新的 (y, length - x) 坐标值
                int temp = matrix[y][length - x];
                matrix[y][length - x] = value;
                value = temp;
                // 更新当前坐标
                int m = x;
                x = y;
                y = length - m;
            } while (x != i || y != j);
            // 回到起点时,结束当前循环
        }
    }
}

题解二

/**
 * 由刚才规律得知,每一次都只会交换四个位置的值,所以简化如下
 *
 * @param matrix
 */
public static void rotate1(int[][] matrix) {
    // 长度
    int length = matrix[0].length - 1;
    // 每一层
    for (int i = 0; i < matrix[0].length / 2; i++) {
        // 从 0,0 开始
        for (int j = i; j < length - i; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[length - j][i];
            matrix[length - j][i] = matrix[length - i][length - j];
            matrix[length - i][length - j] = matrix[j][length - i];
            matrix[j][length - i] = temp;
        }
    }
}

题解三

/**
 * 如果可以借助辅助数组,那根据刚才的规律可简化
 *
 * @param matrix
 */
public static void rotate(int[][] matrix) {
    int length = matrix[0].length;
    int[][] matrix_new = new int[length][length];
    for (int i = 0; i < length; i++){
        for (int j = 0; j < length; j++){
            matrix_new[j][length - i - 1] = matrix[i][j];
        }
    }
    for (int i = 0; i < length; i++){
        for (int j = 0; j < length; j++){
            matrix[i][j] = matrix_new[i][j];
        }
    }
}

题解四

/**
 * 水平翻转 + 对角线翻转
 *  1  2  3  4
 *  5  6  7  8
 *  9 10 11 12
 * 13 14 15 16
 * 水平翻转
 * 13 14 15 16
 *  9 10 11 12
 *  5  6  7  8
 *  1  2  3  4
 * 对角线翻转
 * 13  9  5  1
 * 14 10  6  2
 * 15 11  7  3
 * 16 12  8  4
 *
 * @param matrix
 */
public static void rotate3(int[][] matrix) {
    int length = matrix[0].length;
    // 水平翻转
    for (int i = 0; i < length / 2; i++){
        for (int j = 0; j < length; j++){
            int temp = matrix[i][j];
            matrix[i][j] = matrix[length - i - 1][j];
            matrix[length - i - 1][j] = temp;
        }
    }
    // 对角线翻转
    for (int i = 0; i < length; i++){
        for (int j = 0; j < i; j++){
            int temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-image