持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
1.描述
给定一个 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.思路
本题需要我们将一个n x n的二维矩阵进行一个顺时针旋转90度。单独来看这个要求的话很简单,因为是固定旋转90度,那么就像是一个纯函数一样,相同的输入一定会得到相同的输出,数组元素旋转后的位置一定是固定的,我们可以通过使用一个辅助数组,来存放旋转后的数组,然后将原来数组的元素按照一定的规律重新排放到辅助数组里面。
通过观察旋转前后的变化,我们可以得到一个规律,那就是旋转前的行变成了旋转后的列,也就是第一行变成了最后一列,内部元素顺序不变,我们可以通过这个规律,来遍历数组,然后将元素安放在对应的位置
var rotate = function(matrix) {
const len = matrix.length;
//填充辅助数组
const matrixNew = new Array(len).fill(0).map(() => new Array(n).fill(0));
for (let i = 0; i < len; i++) {
for (let j = 0; j < len; j++) {
matrixNew[j][len - i - 1] = matrix[i][j];
}
}
return matrixNew
};
但是本题还有一个要求,需要我们在原地旋转图像,不能使用辅助数组,这样的要求下,我们就不能使用原本的思路来解决这个问题,但是我们还是需要寻找规律,因为我们只能在原数组上面操作,所以我们只能通过对数组元素进行交换位置的方式来解决问题。
借用之前的观察结果,我们的目的是将行变成列,那么对角线就是一个比较重要的角色了,我们可以观察到,在通过对角线翻转之后我们的矩阵就已经完成了从行到列的转换,只不过位置和我们旋转90度的位置还有一些偏差,只需要再做一次对位交换,我们就能得到旋转90度以后的矩阵了。
var rotate = function(matrix) {
let len = matrix[0].length
for(let i = 0;i<len;i++){
for(let j = i; j<matrix[i].length;j++){
[matrix[i][j],matrix[j][i]] = [matrix[j][i],matrix[i][j]]
}
}
for(let i = 0;i<len;i++){
for(let j = 0;j<len/2;j++){
[matrix[i][j],matrix[i][len-j-1]]=[matrix[i][len-j-1],matrix[i][j]]
}
}
};