Typescript-Algorithms
    Preparing search index...

    Variable rotate_imageConst

    rotate_image: (matrix: number[][]) => void = rotate

    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

    Type declaration

      • (matrix: number[][]): void
      • Do not return anything, modify matrix in-place instead.

        Parameters

        • matrix: number[][]

        Returns void

    规律是从 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轮所有操作。

    • 要进行多少轮?答案是只要 b > t && l < r 就继续,否则停止。
    • 每一轮交换多少次,答案是 r - l 次。
    /**
    * 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--;
    }
    };