给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
![](https://img-blog.csdnimg.cn/img_convert/7b908ee60ec414a81b96c8c658cd0c5c.jpeg)
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
示例 2:
![](https://img-blog.csdnimg.cn/img_convert/2e96f24bfe7fddac49d00a07e2fa30b7.jpeg)
输入: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]]
解法思路:
这种矩阵变换旋转的题目,我们就可以根据对角线和中水平线和中竖线组合进行矩阵的转置,从而达到题目的目的。这道题我们可以先根据左下到右上这条对角线进行交换一次,然后再根据中水平线上下交换一下数就可以得到顺时针旋转90°的目的;我们也可以根据左上到右下这条对角线进行交换,然后再根据中竖线左右进行交换一次数也可以得到顺时针旋转90°的目的。
var rotate = function(matrix) {
let len = matrix.length;
// 先按照左下角到右上角这条对角线进行翻转 我们只需要操作对角线一侧的数 如果全部操作 矩阵又变回了原先的样子 所以行数i要小于(数组行数减去1) 列数要小于(数组列数减去i再减去1)
for(let i = 0; i < matrix.length - 1; i++){
for(let j = 0; j < matrix[i].length - i -1; j++){
let temp = 0;
temp = matrix[i][j];
matrix[i][j] = matrix[len - 1 - j][len - 1 - i];
matrix[len - 1 - j][len - 1 - i] = temp;
}
}
// 接下来将矩阵按照水平中线进行翻转 就得到了结果
let count = len >> 1;
for(let i = 0; i < count; i++){
for(let j = 0; j < matrix[i].length; j++){
let temp = 0;
temp = matrix[i][j];
matrix[i][j] = matrix[len - 1 - i][j];
matrix[len - 1 - i][j] = temp;
}
}
};
类似旋转:
情况一:顺时针转 90 度:先转置再左右镜像
1 | 2 | 3 | 7 | 4 | 1 | |
4 | 5 | 6 | -> | 8 | 5 | 2 |
7 | 8 | 9 | 9 | 6 | 3 |
情况二:顺时针转 180 度:先上下镜像,再左右镜像(先左右再上下也可)
1 | 2 | 3 | 9 | 8 | 7 | |
4 | 5 | 6 | -> | 6 | 5 | 4 |
7 | 8 | 9 | 3 | 2 | 1 |
情况三:顺时针转 270 度:先转置再上下镜像
1 | 2 | 3 | 3 | 6 | 9 | |
4 | 5 | 6 | -> | 2 | 5 | 8 |
7 | 8 | 9 | 1 | 4 | 7 |