给定一个 n × 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 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