1. 题目描述

给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。

说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

示例 1:

  1. 给定 matrix =
  2. [
  3. [1,2,3],
  4. [4,5,6],
  5. [7,8,9]
  6. ],
  7. 原地旋转输入矩阵,使其变为:
  8. [
  9. [7,4,1],
  10. [8,5,2],
  11. [9,6,3]
  12. ]

示例 2:

  1. 给定 matrix =
  2. [
  3. [ 5, 1, 9,11],
  4. [ 2, 4, 8,10],
  5. [13, 3, 6, 7],
  6. [15,14,12,16]
  7. ],
  8. 原地旋转输入矩阵,使其变为:
  9. [
  10. [15,13, 2, 5],
  11. [14, 3, 4, 1],
  12. [12, 6, 8, 9],
  13. [16, 7,10,11]
  14. ]

2. 解题思路

对于这个矩阵,我们可以先沿着左上角到右下角对角线进行翻转,在沿着垂直的中心进行对称。

  1. // 初始的矩阵
  2. [
  3. [1,2,3],
  4. [4,5,6],
  5. [7,8,9]
  6. ]
  7. //(1)沿着左上角到右下角对角线进行翻转
  8. [
  9. [1,4,7],
  10. [2,5,8],
  11. [3,6,9]
  12. ]
  13. //(2)沿着垂直的中心进行对称
  14. [
  15. [7,4,1],
  16. [8,5,2],
  17. [9,6,3]
  18. ]

复杂度分析

  • 时间复杂度:O(n),其中 n 是 matrix 的边长。对于每一次翻转操作,我们都需要枚举矩阵中一半的元素。
  • 空间复杂度:O(1)。为原地翻转得到的原地旋转。

    3. 代码实现

    1. /**
    2. * @param {number[][]} matrix
    3. * @return {void} Do not return anything, modify matrix in-place instead.
    4. */
    5. var rotate = function(matrix) {
    6. const n = matrix.length
    7. for(let i = 0; i < n; i++){
    8. for(let j = i; j < n; j++){
    9. [matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]]
    10. }
    11. }
    12. for(let k = 0; k < n; k++){
    13. for(let l = 0; l < Math.floor(n/2); l++){
    14. [matrix[k][l], matrix[k][n-1-l]] = [matrix[k][n-1-l], matrix[k][l]]
    15. }
    16. }
    17. };

    4. 提交结果

    image.png