Const
Do not return anything, modify matrix in-place instead.
规律是从 l, b -> l, t -> r, t -> r, b 依次替换这些位置的数。比如
[
[1,2,3],
[4,5,6],
[7,8,9]
]
旋转后的结果是:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
规律是: 7来到1,1来到3,3来到9,9来到7 4来到2,2来到6,6来到8,8来到4 进入内层,只有1个5
再比如
[
[05,01,09,11],
[02,04,08,10],
[13,03,06,07],
[15,14,12,16]
]
旋转后结果是:
[
[15,13,02,05],
[14,03,04,01],
[12,06,08,09],
[16,07,10,11]
]
规律是: 第一轮 15来到05,05来到11,11来到16,16来到15 13来到01,01来到10,10来到12,12来到13 02来到09,09来到07,07来到14,14来到02
第二轮 3来到4,4来到8,8来到6,6来到3
终止
根据规律观察,数的替换会从外层朝内层走动,所以应该也会需要 t, r, b, l 指针用来围圈
同时发现,替换的开始是从 (b, l) 这个位置发起的,我们以这个位置开始作为替换起点,看下具体规律:
第1轮-第1次 坐标在 (b + 0, l) 的元素来到坐标在 (t, l + 0) 的元素位置, 坐标在 (t, l) 的元素来到坐标在 (t, r) 的元素位置, 坐标在 (t + 0, r) 的元素来到坐标在 (b, r) 的元素位置。
第1轮-第2次 坐标在 (b + 1, l) 的元素来到坐标在 (t, l + 1) 的元素位置 坐标在 (t, l + 1) 的元素来到坐标在 (t + 1, r) 的位置 坐标在 (t + 1, r) 的元素来到坐标在 (b, r - 1) 的位置
第1轮-第3次 坐标在 (b + 2, l) 的元素来到坐标在 (t, l + 2) 的元素位置 坐标在 (t, l + 2) 的元素来到坐标在 (t + 2, r) 的位置 坐标在 (t + 2, r) 的元素来到坐标在 (b, r - 2) 的位置
第1轮停止 b + 3 === t 停止第一轮搜索 此时 t++, b--, l++, r--
第2轮开始,重复第1轮所有操作。
/**
* Do not return anything, modify matrix in-place instead.
*/
function rotate(matrix: number[][]): void {
const n = matrix.length;
const m = matrix[0].length;
let t = 0;
let b = n - 1;
let l = 0;
let r = m - 1;
while (t < b && l < r) {
for (let i = 0; i < r - l; i++) {
let temp = matrix[t][l + i];
matrix[t][l + i] = matrix[b - i][l];
matrix[b - i][l] = matrix[b][r - i];
matrix[b][r - i] = matrix[t + i][r];
matrix[t + i][r] = temp;
}
t++;
b--;
l++;
r--;
}
};
48.旋转图像
给定一个 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 == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000