本文最后更新于:2023年3月19日 晚上
- 旋转图像、数学矩阵规律
给定一个 n *× n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
*说明:**
你必须在**原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
**示例 1:
1 2 3 4 5 6 7 8 9 10 11 12
| 给定 matrix =
, 原地旋转输入矩阵,使其变为:
|
示例 2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 给定 matrix =
, 原地旋转输入矩阵,使其变为:
|
思路
规律旋转
先交换 4 个顶点的值,再看下一个需要交换点有规律存在:
- 左上角的点,取右边的点
- 右上角的点,取下边的点
- 右下角的点,取左边的点
- 左下角的点,取上边的点
按这个规律可以交换完该边上的所有点,就完成了最外一层的交换。
那么现在可以写一个递归函数,传入 start(该层最左上的点的横纵坐标,例如第一层为(0,0),第二层则为(1,1) ),end(该层最右下点的横纵左边,例如 matrix 的边长为 4,第一层应该为(3,3),第二层则为(2,2) ),num(该层的需要交换的节点数量,例如 matrix 的边长为 4,则第一层 num 应该交换 3 个节点,num=3,第二层 num=1)
所以可以得到递归的规律:
传入的参数每层,start+1,end-1,num-2,当 num<=0 的时候表示没有需要交换的点,退出递归
转置矩阵镜像
先将矩阵上下水平翻转,再求转置矩阵即对角线翻转即可得到结果
解答
规律旋转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
var rotate = function (matrix) { const r = (start, end, num) => { if (num <= 0) return; for (let i = 0; i < num; i++) { let temp = matrix[start][start + i]; matrix[start][start + i] = matrix[end - i][start]; matrix[end - i][start] = matrix[end][end - i]; matrix[end][end - i] = matrix[start + i][end]; matrix[start + i][end] = temp; } r(start + 1, end - 1, num - 2); }; r(0, matrix.length - 1, matrix.length - 1); };
|
转置矩阵镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
var rotate = function (matrix) { for (let i = 0; i < parseInt(matrix.length / 2); i++) { [matrix[i], [matrix[matrix.length - 1 - i]]] = [ matrix[matrix.length - 1 - i], [matrix[i]], ]; } for (let i = 0; i < matrix.length; i++) { for (let j = i; j < matrix.length; j++) { [matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]]; } } };
|