Java 中的旋转给定矩阵

2025 年 1 月 6 日 | 阅读 4 分钟

旋转矩阵是计算机科学中的一个常见问题,尤其是在图形和图像处理领域。有不同的方法可以旋转矩阵,其时间和空间复杂度各不相同。在这里,我们将讨论如何使用三种不同的方法将矩阵顺时针旋转 90 度。

  1. 使用转置和翻转
  2. 使用逐层方法

使用转置和翻转方法

这种方法包括两个主要步骤。首先,转置矩阵,这意味着将矩阵的所有行转换为列,反之亦然。然后,反转转置矩阵的每一行,以实现顺时针旋转 90 度。

  • 转置:对于所有 i < j 的元素,将 (i, j) 位置的元素与 (j, i) 位置的元素交换。
  • 翻转行:对于每一行,将元素从行的开头到末尾进行翻转。

文件名:RotateMatrixTransposeReverse.java

输出

 
Rotated Matrix:
7 4 1 
8 5 2 
9 6 3   

时间复杂度:O(n2),因为需要遍历矩阵进行转置和翻转操作。

空间复杂度:如果原地进行,则为 O(1)。

使用逐层方法

这种方法从最外层开始,向内层移动,逐层旋转矩阵。每一层由矩阵的四个边组成,每个元素都移动到其在顺时针旋转 90 度的相应位置。

  • 逐层:对于每一层,将四个一组的元素进行交换。将元素从顶部移到右侧,从右侧移到底部,从底部移到左侧,从左侧移到顶部。
  • 遍历层:继续对每一层执行此过程,从最外层向内层移动。

文件名:RotateMatrixLayerByLayer.java

输出

 
Rotated Matrix:
7 4 1 
8 5 2 
9 6 3   

时间复杂度:O(n2),因为每个元素都移动一次。

空间复杂度:O(1),因为旋转是原地进行的。

结论

转置和翻转方法以及逐层方法都提供了高效的顺时针旋转矩阵 90 度的方法,每种方法都有其自身的优点。

  • 转置和翻转:此方法首先转置矩阵,然后反转每一行。由于需要遍历矩阵进行转置和翻转操作,因此其时间复杂度为 O(n2)。
    它在空间方面也很高效,空间复杂度为 O(1),因为操作可以就地执行。这种方法易于实现和理解,使其成为许多应用的不错选择。
  • 逐层:此方法通过逐层处理矩阵来旋转矩阵,从最外层开始向内移动。由于每个元素都移动一次,因此其时间复杂度也为 O(n2)。
    空间复杂度为 O(1),因为它在原地修改矩阵,无需额外存储。此方法对于原地旋转至关重要的场景非常有效,并且提供了一种清晰、系统的方法来处理矩阵旋转。

两种方法都适用于原地旋转矩阵,并能高效地利用时间和空间,从而根据手头问题的具体要求提供灵活性。