携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
题目描述
给定一个 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*n的二维数组,说明它具有对称性。我们将一个正方形旋转90度,必然是有规律可循的。
首先看图2中第一行经过旋转后的坐标:
(0,0) => (2,0)
(0,1) => (2,1)
(0,2) => (2,2)
(0,2) => (2,3)
从图上可以看出:
第一行的所有元素经过旋转都变成了最后一列,如(0,0)变成了(0, 3-1-0) => (2,0)
第二行的所有元素经过旋转都变成了倒数第二列,如(0,1)变成了(0, 3-1-1) => (2,1)
由此可推出:第i行的所有元素经过旋转所在y坐标为n-i-1。
结合旋转后的坐标我们可以推出:
第i行中,元素(i, j) 经过旋转后,所在的坐标为(j, n-i-1);
题解
/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
var rotate = function(matrix) {
let n = matrix.length;
let matrixTemp = new Array(n).fill(0).map(()=>new Array(n).fill(0));
for(let i=0; i<n; ++i) {
for(let j=0; j<n; ++j) {
matrixTemp[j][n - i - 1] = matrix[i][j];
}
}
for(let i=0; i<n; ++i) {
for(let j=0; j<n; ++j) {
matrix[i][j] = matrixTemp[i][j];
}
}
return matrix;
};
由于题目要求我们需要使用原地算法,因此最后的返回结果仍然得是matrix,这里为了方便就直接对matrix重新赋值了。