Java 中将矩阵旋转 180 度

2024年9月10日 | 阅读 9 分钟

在本节中,我们将讨论如何在Java 中将矩阵旋转 180 度。在此问题中,给出一个方阵,我们需要将其旋转 1800

示例 1

输入

4 6 7 8

9 3 2 1

9 0 4 5

8 0 3 2

输出

2 3 0 8

5 4 0 9

1 2 3 9

8 7 6 4

旋转矩阵 180 度的思路

有几种方法可以解决此问题,但在本节中,我们将讨论以下方法:

  • 朴素方法
  • 使用转置矩阵
  • 通过交换位置

让我们从最简单的方法开始。

朴素方法

考虑上面的示例。我们注意到我们正在以反序打印输入矩阵的行,从最底行的向上移动。

例如,如果输入数组有 5 行,则首先打印第 5 行。之后,打印第 4 行,然后打印第 3 行,依此类推。

让我们看看最简单方法的实现。

文件名: RotateMatrix.java

输出

For the following matrix: 
4 6 7 8 
9 3 2 1 
9 0 4 5 
8 0 3 2 

The rotated matrix at 180 degree is: 
2 3 0 8 
5 4 0 9 
1 2 3 9 
8 7 6 4 

For the following matrix: 
4 7 8 6 7 
9 2 1 9 1 
9 0 5 4 3 
5 6 7 2 1 
8 9 0 5 1 

The rotated matrix at 180 degree is: 
1 5 0 9 8 
1 2 7 6 5 
3 4 5 0 9 
1 9 1 2 9 
7 6 8 7 4

使用转置矩阵

以下算法描述了如何使用矩阵转置的概念来解决此问题。

步骤 1:计算给定矩阵的转置。

步骤 2:反转转置矩阵的列。

步骤 3:在上一步中反转列后,再次找到矩阵的转置。

步骤 4:反转步骤 3 中找到的矩阵的列。

例如,如果我们有一个输入矩阵

14 27 38 46 57

79 52 31 39 11

99 80 15 24 43

45 56 97 82 51

78 79 60 25 41

那么它的转置将是

14 79 99 45 78

27 52 80 56 79

38 31 15 97 60

46 39 24 82 25

57 11 43 51 41

现在,我们将反转其列

57 11 43 51 41

46 39 24 82 25

38 31 15 97 60

27 52 80 56 79

14 79 99 45 78

再次,我们将转置矩阵。

57 46 38 27 14

11 39 31 52 79

43 24 15 80 99

51 82 97 56 45

41 25 60 79 78

再次,我们将反转其列。

41 25 60 79 78

51 82 97 56 45

43 24 15 80 99

11 39 31 52 79

57 46 38 27 14

以下程序描述了上述方法的实现。

文件名: RotateMatrix1.java

输出

For the following matrix: 
4 6 7 8 
9 3 2 1 
9 0 4 5 
8 0 3 2 

The rotated matrix at 180 degree is: 
2 3 0 8 
5 4 0 9 
1 2 3 9 
8 7 6 4 

For the following matrix: 
4 7 8 6 7 
9 2 1 9 1 
9 0 5 4 3 
5 6 7 2 1 
8 9 0 5 1 

The rotated matrix at 180 degree is: 
1 5 0 9 8 
1 2 7 6 5 
3 4 5 0 9 
1 9 1 2 9 
7 6 8 7 4 

通过交换位置

如我们在上述方法中所见,需要两次找到矩阵的转置。此外,还需要两次反转列。因此,我们可以进行一些优化以获得更好的解决方案。

在此方法中,我们将交换不同位置的值。请注意以下程序。

文件名: RotateMatrix2.java

输出

For the following matrix: 
4 6 7 8 
9 3 2 1 
9 0 4 5 
8 0 3 2 

The rotated matrix at 180 degree is: 
2 3 0 8 
5 4 0 9 
1 2 3 9 
8 7 6 4 

For the following matrix: 
4 7 8 6 7 
9 2 1 9 1 
9 0 5 4 3 
5 6 7 2 1 
8 9 0 5 1 

The rotated matrix at 180 degree is: 
1 5 0 9 8 
1 2 7 6 5 
3 4 5 0 9 
1 9 1 2 9 
7 6 8 7 4 

复杂度分析

在上面的程序中,我们遍历矩阵的每一行和每一列。这导致时间复杂度为 O(R * C),其中 R 是输入矩阵的行大小,C 是输入矩阵的列大小。

请注意,我们不使用任何辅助空间来存储数据;对于交换数据,我们使用同一个输入数组,这导致空间复杂度为 O(1)。