LeetCode 数据结构基础 - 旋转图像

112 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

旋转图像

原题地址

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

思路分析

方法一

image.png

分析示例中旋转的规律,可以看到:

  1. 第一行的第 n 个元素旋转后正好是最后一列的第 n 个元素。
  2. 第二行的第 n 个元素旋转后正好是倒数第二列的第 n 个元素。
  3. 同理,第三行以及第四行的第 n 个元素旋转后正好是倒数第三列以及第四列的第 n 个元素。
  4. 那么我们可以找到如下规律:第i行第j个 元素旋转后正好是 倒数第i列第j个 元素。即:matrix[j][len - i - 1] = matrix[i][j];
  5. 使用一个辅助数组 temp 来做中转;
  6. 定义一个 lenlen 列元素都为 0 的二维数组;
  7. 遍历原数组 matrix,按照上述找的规律可知 temp[j][len - i - 1] = matrix[i][j]
  8. 通过第七步可以得到旋转后的新数组 temp,遍历 temp,将 matrix 中的元素进行替换即可。

方法二

image.png

  1. 如上图所示,我们可以看到 matrix 经过水平翻转再经过对角线翻转后可以得到我们想要的结果。
  2. 因此通过两次遍历数组,可以达到在不使用辅助数组的情况下,得到想要的翻转后的结果。

AC 代码

方法一

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

结果:

  • 执行结果: 通过
  • 执行用时:60 ms, 在所有 JavaScript 提交中击败了83.11%的用户
  • 内存消耗:40.9 MB, 在所有 JavaScript 提交中击败了57.52%的用户
  • 通过测试用例:21 / 21

方法二

/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var rotate = function(matrix) {
    const n = matrix.length;
    for (let i = 0; i < Math.floor(n / 2); i++) {
        for (let j = 0; j < n; j++) {
            [matrix[i][j], matrix[n - i - 1][j]] = [matrix[n - i - 1][j], matrix[i][j]];
        }
    }
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < i; j++) {
            [matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];
        }
    }
};

结果:

  • 执行结果:通过
  • 执行用时:60 ms, 在所有 JavaScript 提交中击败了83.11%的用户
  • 内存消耗:42.9 MB, 在所有 JavaScript 提交中击败了6.50%的用户
  • 通过测试用例:21 / 21

END