方法一:使用辅助数组

我们以题目中的示例二

image.png

作为例子,分析将图像旋转 90 度之后,这些数字出现在什么位置。
对于矩阵中的第一行而言,在旋转后,它出现在倒数第一列的位置:
image.png

并且,第一行的第 x 个元素在旋转后恰好是倒数第一列的第 x 个元素。
对于矩阵中的第二行而言,在旋转后,它出现在倒数第二列的位置:
image.png

对于矩阵中的第三行和第四行同理。这样我们可以得到规律:

对于矩阵中第 i 行的第 j 个元素,在旋转后,它出现在倒数第 i 列的第 j 个位置。

我们将其翻译成代码。由于矩阵中的行列从 0 开始计数,因此对于矩阵中的元素 旋转矩阵 - 图4,在旋转后,它的新位置为 旋转矩阵 - 图5

这样以来,我们使用一个与 旋转矩阵 - 图6 大小相同的辅助数组 旋转矩阵 - 图7
,临时存储旋转后的结果。我们遍历 旋转矩阵 - 图8 中的每一个元素,根据上述规则将该元素存放到 旋转矩阵 - 图9 中对应的位置。在遍历完成之后,再将 旋转矩阵 - 图10
中的结果复制到原数组中即可。

  1. var rotate = function (matrix) {
  2. const n = matrix.length;
  3. const matrix_new = new Array(n).fill(0).map(() => new Array(n).fill(0));
  4. //
  5. for (let i = 0; i < n; i++) {
  6. for (let j = 0; j < n; j++) {
  7. matrix_new[j][n - i - 1] = matrix[i][j];
  8. }
  9. }
  10. // 复制到原数组中
  11. for (let i = 0; i < n; i++) {
  12. for (let j = 0; j < n; j++) {
  13. matrix[i][j] = matrix_new[i][j];
  14. }
  15. }
  16. };