给定由nxn矩阵表示的图像,其中图像中的每个像素为4个字节,编写一种方法将图像旋转90度。(到位)
我做了一个效率低下的解决方案,把每一行复制到一个临时文件中,然后执行交换,占用o(N)空间,下面的实际解决方案更好,但我不明白。
def rotate_matrix(matrix):
'''rotates a matrix 90 degrees clockwise'''
n = len(matrix)
for layer in range(n // 2):
first, last = layer, n - layer - 1
for i in range(first, last):
# save top
top = matrix[layer][i]
# left -> top
matrix[layer][i] = matrix[-i - 1][layer]
# bottom -> left
matrix[-i - 1][layer] = matrix[-layer - 1][-i - 1]
# right -> bottom
matrix[-layer - 1][-i - 1] = matrix[i][- layer - 1]
# top -> right
matrix[i][- layer - 1] = top
return matrix
上面的代码是Python解决方案,
我不明白for循环,为什么它在n//2范围内,从第一层到n层-1。
此外,为什么这个问题提到了4个字节,它似乎是无用的信息。
谢谢!
发布于 2019-07-21 13:51:06
考虑n
是奇数还是偶数是很重要的,因为必须以微妙的不同方式来处理这个问题。然而,在任何一种情况下,广场都可以被分解成象限。
n
是奇怪的:
广场被分成四个矩形象限。在双循环的每一次迭代中,准确地旋转了4个元素,其中一个来自每个象限。中间元素永远不会被访问,因为它在旋转时保持在中间。
+-------+---+
| x x | x |
+---+---+ |
| x | x | x |
| +---+---+
| x | x x |
+---+-------+
n
甚至是这样的:
矩阵被分解成4个正方形象限。同样,在双循环的每一次迭代中,准确地旋转了4个元素,每个象限中有一个.在偶数情况下,必须移动每个元素(即没有完美的中心元素)。
+-------+-------+
| x x | x x |
| | |
| x x | x x |
+-------+-------+
| x x | x x |
| | |
| x x | x x |
+-------+-------+
n // 2
和n - layer - 1
只是伪装的地板和天花板功能。地板和天花板是需要的n
是奇怪的情况。这些值用于在其中一个象限上设置一个迭代。然后,无论在其中一个象限中存在多少元素,都会出现4个交换(在top
临时值的帮助下)。
发布于 2019-07-21 13:53:38
基本上,我们通过从外部边界旋转元素到矩阵的核心,顺时针交换元素。
让我们以以下矩阵为例:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
在第一次迭代中,我们关注外部元素:
1 2 3 4
5 x x 8
9 x x 12
13 14 15 16
在这里,我们开始(内循环)顺时针交换所有元素。在我们的示例中,我们将4(在将其存储在临时变量中)替换为1,然后将1替换为13,依此类推。最后,我们用保存的4替换16,继续这样做,直到所有元素都被交换为止。因此,在外部循环的第一次迭代之后,我们的数组如下所示:
13 9 5 1
14 6 7 2
15 10 11 3
16 12 8 4
在那之后,我们移动到下一层。在我们的例子中,我们现在看一看:
x x x x
x 6 7 x
x 10 11 x
x x x x
我们再次逐一交换所有元素,如上面所示。我们有n/2层迭代,因为对于不均匀的n次迭代,最后一次迭代只留下一个元素,显然不需要旋转。
这给我们留下了:
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
这4个字节是像c这样的语言所需要的,在这里我们必须手动管理内存。它们的起源很可能是这样一个事实:每个像素由3种颜色(红色、绿色和蓝色)组成,每种颜色由8位(0-255)表示。此外,还可以有8位的不透明度。所以剩下32位=4字节。
https://stackoverflow.com/questions/57133411
复制相似问题