Leetcode 48. 旋转图像

68 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

1.描述

给定一个 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.思路

本题需要我们将一个n x n的二维矩阵进行一个顺时针旋转90度。单独来看这个要求的话很简单,因为是固定旋转90度,那么就像是一个纯函数一样,相同的输入一定会得到相同的输出,数组元素旋转后的位置一定是固定的,我们可以通过使用一个辅助数组,来存放旋转后的数组,然后将原来数组的元素按照一定的规律重新排放到辅助数组里面。

通过观察旋转前后的变化,我们可以得到一个规律,那就是旋转前的行变成了旋转后的列,也就是第一行变成了最后一列,内部元素顺序不变,我们可以通过这个规律,来遍历数组,然后将元素安放在对应的位置

var rotate = function(matrix) {
    const len = matrix.length;
    //填充辅助数组
    const matrixNew = new Array(len).fill(0).map(() => new Array(n).fill(0));
    for (let i = 0; i < len; i++) {
        for (let j = 0; j < len; j++) {
            matrixNew[j][len - i - 1] = matrix[i][j];
        }
    }
    return matrixNew
};

但是本题还有一个要求,需要我们在原地旋转图像,不能使用辅助数组,这样的要求下,我们就不能使用原本的思路来解决这个问题,但是我们还是需要寻找规律,因为我们只能在原数组上面操作,所以我们只能通过对数组元素进行交换位置的方式来解决问题。

借用之前的观察结果,我们的目的是将行变成列,那么对角线就是一个比较重要的角色了,我们可以观察到,在通过对角线翻转之后我们的矩阵就已经完成了从行到列的转换,只不过位置和我们旋转90度的位置还有一些偏差,只需要再做一次对位交换,我们就能得到旋转90度以后的矩阵了。

var rotate = function(matrix) {
    let len = matrix[0].length
    for(let i = 0;i<len;i++){
        for(let j = i; j<matrix[i].length;j++){
            [matrix[i][j],matrix[j][i]] = [matrix[j][i],matrix[i][j]]
        }
    }
    for(let i = 0;i<len;i++){
        for(let j = 0;j<len/2;j++){
            [matrix[i][j],matrix[i][len-j-1]]=[matrix[i][len-j-1],matrix[i][j]]
        }

    }
};