图像题库
旋转矩阵(旋转图像)
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 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]
]
旋转规律: 对于矩阵中第 i 行的第 j 个元素,在旋转后,它出现在第 j 行倒数第 i 列 位置。
方案A 通过辅助矩阵
思路:
- 关键等式: matrixNew[col][len-row-1] = matrix[row][col]
这样以来,我们使用一个与 matrix 大小相同的辅助数组 matrixNew,临时存储旋转后的结果。我们遍历 matrix 中的每一个元素,根据上述规则将该元素存放到 matrixNew 中对应的位置。在遍历完成之后,再将 matrixNew中的结果 复制到原数组中即可。
:::details 点击查看代码
function createMatrix(array,row,col){
let matrix=[];
for(let i=0;i<row;i++){
matrix[i]=[];
for(let j=0;j<col;j++){
matrix[i][j]=array.shift();
}
}
return matrix
}
function rotateMatrix(matrix){
let row=matrix.length;
let col=matrix[0].length;
let matrixNew=new Array(row).fill(0).map(val=>new Array(col).fill(0))
for(let i=0;i<row;i++){
for(let j=0;j<col;j++){
matrixNew[j][row-i-1]=matrix[i][j];
}
}
for(let i=0;i<row;i++){
for(let j=0;j<col;j++){
matrix[i][j]=matrixNew[i][j];
}
}
return matrix
}
let matrix=createMatrix([1,2,3,4,5,6,7,8,9],3,3);
rotateMatrix(matrix)
console.log(matrix);
:::
性能分析:
时间复杂度:O(N^2),其中 N 是 matrix 的边长。
空间复杂度:O(N^2) 我们需要使用一个和 matrix 大小相同的辅助数组。