小哆啦解题记:旋转图像的奇妙旅程

小哆啦开始刷力扣的第二十九天

54. 螺旋矩阵 - 力扣(LeetCode)

️ 初次尝试:暴力解法,左右互搏

小哆啦接到了一道任务:把一个 n × n 的二维矩阵顺时针旋转 90 度。

“这不简单嘛!”小哆啦自信满满地甩了甩他的圆手,开始思考。

直接上代码!

var rotate = function(matrix) {
  let n = matrix.length;
  let newMatrix = Array.from({ length: n }, () => new Array(n).fill(0));

  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      newMatrix[j][n - 1 - i] = matrix[i][j];
    }
  }

  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      matrix[i][j] = newMatrix[i][j];
    }
  }
};

小哆啦运行了一下,嘿!真的旋转成功了!可还没等开心多久,小智就默默出现了。

“小哆啦,这样做不对啊。”

“哪里不对了?不是旋转了吗?”

“可是你用的是额外的空间 newMatrix,这题要求原地旋转,不能新建数组哦!”

小哆啦一愣,脑袋上仿佛有只空气炮炸开:“啊?!原地操作?”


小智引导:逐层旋转,大显身手

小智开始耐心引导:“你想啊,我们可以一层一层地旋转,每次处理四个角的位置,不需要额外的数组。”

小哆啦听得似懂非懂,但还是决定试一试。

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

小哆啦运行了一下,结果还是对的!而且没有额外数组!

“原来是这样!一层一层旋转,每次把四个点调换位置,不需要额外空间!简直像玩魔方一样!”

小智笑了笑:“对,就是魔方思维。”


终极思考:转置加翻转,思维飞跃

小哆啦觉得已经很棒了,但小智又抛出了一个新思路:“其实,我们还可以用转置矩阵+左右翻转的方法来简化操作。”

小哆啦惊呆了:“还能这么玩?!”

var rotate = function(matrix) {
  let n = matrix.length;

  // 先转置矩阵
  for (let i = 0; i < n; i++) {
    for (let j = i; j < n; j++) {
      [matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];
    }
  }

  // 再左右翻转
  for (let i = 0; i < n; i++) {
    matrix[i].reverse();
  }
};

“转置让行变成列,然后左右翻转就等于顺时针旋转90度!”

小哆啦激动得差点打翻工具箱:“哇!这比魔方还魔法!”


总结:从暴力到优雅

  1. 暴力法:使用额外空间存储旋转结果——违背题意!❌
  2. 逐层旋转法:模拟魔方操作,四点调换,真正原地旋转。✅
  3. 转置+翻转法:数学思维加持,将旋转拆解成两步,简洁且高效。✨

小智拍了拍小哆啦:“别光想着‘做出来’,还要想‘怎么优雅地做’。”

小哆啦点头如捣蒜:“嗯嗯!思维飞跃,从暴力到优雅,这才是解题的乐趣啊!”


下一次解题,小哆啦还能学到什么呢?敬请期待~

你可能感兴趣的:(大话力扣150题,前端,算法,大话力扣)