leetcode-数组-48-旋转图像

48. 旋转图像

描述

  • 给定一个 n × n 的二维矩阵表示一个图像。
  • 将图像顺时针旋转 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]
]

思路 1

  • 先将矩阵沿右上角到左下角的对角线进行对称,然后将矩阵沿水平中线对称即可。

代码 1

const rotate = (matrix) => {
    let n = matrix.length;

    // 按右上角到左下角对称线
    for(let i = 0;i<n;i++){
        for(let j = 0;j<n-i-1;j++){
            const temp = matrix[i][j];
            matrix[i][j] = matrix[n-j-1][n-i-1]
            matrix[n-j-1][n-i-1] = temp;
        }
    }

    // 按水平线
    for(let k =0;k<Math.floor(n/2);k++){
        const temp = matrix[k]
        matrix[k] = matrix[n-1-k]
        matrix[n-1-k] = temp;
    }
}

复杂度分析 1

  • 时间复杂度:O(n^2)。将矩阵进行遍历,二维数组需循环遍历两次,则复杂度为O( n^2)
  • 空间复杂度:O(n)

思路 2

  • 先将矩阵沿左上角到右下角的对角线进行对称,然后将矩阵沿垂直中线对称即可。

代码 2

function rotate (matrix) {
  const n = matrix.length;
  // 调换对角线元素
  for (let i = 0; i < n; i++) {
    for (let j = i; j < n; j++) {
      const temp = matrix[i][j];
      matrix[i][j] = matrix[j][i];
      matrix[j][i] = temp;
    }
  }
  // 调换每行的左右元素
  for (let k = 0; k < n; k++) {
    for (let l = 0; l < Math.floor(n / 2); l++) {
      const temp = matrix[k][l];
      matrix[k][l] = matrix[k][n - 1 - l];
      matrix[k][n - 1 - l] = temp;
    }
  }
}

复杂度分析 2

  • 时间复杂度:O(n^2)。将矩阵进行遍历,二维数组需循环遍历两次,则复杂度为O( n^2)
  • 空间复杂度:O(n)

   转载规则


《leetcode-数组-48-旋转图像》 朝飞 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
leetcode-数组-股票买卖最佳时机合集 leetcode-数组-股票买卖最佳时机合集
121. 买卖股票的最佳时机题目描述(难度:简单) 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。 注意:你不能在买入股票
2020-05-23
下一篇 
leetcode-数组-136-值出现一次的数字 leetcode-数组-136-值出现一次的数字
136. 只出现一次的数字题目描述(难度:简单) 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明:你的算法应该具有线性时间复杂度 示例1: 输入: [2,2,1] 输
2020-05-19
  目录