手摸手提桶跑路——LeetCode48. 旋转图像

149 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

题目描述

给定一个 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*n的二维数组,说明它具有对称性。我们将一个正方形旋转90度,必然是有规律可循的。

首先看图2中第一行经过旋转后的坐标:

(0,0) => (2,0)

(0,1) => (2,1)

(0,2) => (2,2)

(0,2) => (2,3)

从图上可以看出:

第一行的所有元素经过旋转都变成了最后一列,如(0,0)变成了(0, 3-1-0) => (2,0)

第二行的所有元素经过旋转都变成了倒数第二列,如(0,1)变成了(0, 3-1-1) => (2,1)

由此可推出:第i行的所有元素经过旋转所在y坐标为n-i-1

结合旋转后的坐标我们可以推出:

第i行中,元素(i, j) 经过旋转后,所在的坐标为(j, n-i-1);

题解

/** 
* @param {number[][]} matrix 
* @return {void} Do not return anything, modify matrix in-place instead. 
*/
var rotate = function(matrix) {
    let n = matrix.length;
    let matrixTemp = new Array(n).fill(0).map(()=>new Array(n).fill(0));
    for(let i=0; i<n; ++i) {
        for(let j=0; j<n; ++j) {
            matrixTemp[j][n - i - 1] = matrix[i][j];
        }
    }
    for(let i=0; i<n; ++i) {
        for(let j=0; j<n; ++j) {
            matrix[i][j] = matrixTemp[i][j];
        }
    }
    return matrix;
};

由于题目要求我们需要使用原地算法,因此最后的返回结果仍然得是matrix,这里为了方便就直接对matrix重新赋值了。