给定一个 n × n 的二维矩,将图像顺时针旋转90度,且必须原地旋转,即不能借助其他矩阵来完成旋转操作,示例如下
matrix = [
[1,2,3],
[4,5,6],
[7,8,9]
]
//原地旋转输入矩阵,使其变为:
matrix = [
[7,4,1],
[8,5,2],
[9,6,3]
]
1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 |
上面矩阵实际上是按照下图进行变换操作的
最外层顺时针,再往里一层顺时针旋转直到最后一层,因此再遍历的时候有如下变换公式(当前对象和目标对象的下表关系)
- 当前坐标为:(i , j)
- 当前矩阵的行数:length
由上面两个条件可以得到目标交换的坐标为:(j , length - i - 1),按照此思路的代码如下:
/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
var rotate = function(matrix) {
let len = matrix.length;
let real_len = (len/2).toFixed(0);
for (let i = 0; i < real_len; i++) {
for (let j = i; j < len - i - 1; j++) {
let x1 = i,
y1 = j,
x2 = y1,
y2 = len - x1 - 1,
x3 = y2,
y3 = len - x2 - 1,
x4 = y3,
y4 = len - x3 - 1;
let val1 = matrix[x1][y1];
let val2 = matrix[x2][y2];
let val3 = matrix[x3][y3];
let val4 = matrix[x4][y4];
matrix[x2][y2] = val1;
matrix[x3][y3] = val2;
matrix[x4][y4] = val3;
matrix[x1][y1] = val4;
}
}
};
以上是用最简单粗暴的方式来实现同一个矩阵上进行矩阵的旋转