旋转矩阵

August 8, 2018 · View on GitHub

问题

给你一个n x n2D矩阵 (表示图像) . 旋转矩阵90度 (顺时针) .

注意

你必须就地旋转图像,这意味着你必须直接修改输入的2D矩阵. 不要分配另一个2D矩阵并进行旋转.

例子

示例#1

给定输入矩阵:

[
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
]

将输入矩阵就地旋转,使其变为:

[
  [7, 4, 1],
  [8, 5, 2],
  [9, 6, 3],
]

例#2

给定输入矩阵:

[
  [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],
]

算法

我们需要对矩阵进行两次折叠:

  • 垂直折叠
  • 从左下角到右上角对角线折叠

或者我们也可以对角线 左上角/右下角折叠 并水平折叠.

一个常见的问题是你如何确定要做什么样的折叠? 只需撕开一张方形纸,在上面写一个随机字,这样你就可以知道它的旋转. 然后,翻转方形纸,直到找出如何找到解决方案.

下面是如何使用 对角线右上/左下旋转以及水平旋转 来旋转的示例.

假设我们在矩阵的顶部有一个字符串:

A B C
• • •
• • •

让我们做右上/左下对角线折叠:

A B C
/ / •
/ • •  

现在让我们做横向折叠:

A → →
B → →
C → →

字符串已旋转到90度:    

• • A
• • B
• • C

参考