FreedomLy's blog.

【每周一坑】矩阵旋转

字数统计: 416阅读时长: 1 min
2017/09/06 Share

本次的题目是关于矩阵旋转的

问题

给定一个N*N的矩阵(N>=0),将其顺时针旋转90°。输出旋转后的矩阵。
举例:
1 2 3
4 5 6
7 8 9
旋转后输出的结果应该是:
7 4 1
8 5 2
9 6 3

附加要求

在不创建新矩阵的情况下做变换,即所有的修改都在原矩阵上直接进行。

解法

1. 使用额外的空间

顺时针旋转90°,可以把每一列元素取出来组成新的行,再将新的行反转一下就得到旋转后的矩阵了。

如:
1 2 3
4 5 6
7 8 9
取出每一列作为新的行:
1 4 7
2 5 8
3 6 9
再将每一行反转就得到了:
7 4 1
8 5 2
9 6 3

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def rotate(matrix):
"""
:param matrix: List(List(int))
:return: List(List(int))
"""
res = []
if len(matrix[0]) == 0:
return matrix
for i in range(len(matrix[0])):
l = []
for subList in matrix:
l.append(subList[i])
l.reverse()
res.append(l)
return res

2. 在原矩阵上进行操作

旋转90°可以看到变换前和变换后是按照对角线对称后再反转的 (原博客)

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
'''
将矩阵旋转90度,可以看出变换前和变换后的矩阵是按照
对角线对称交换以后再进行反转后得到的
'''
def rotate1(matrix):
"""
:param matrix: List(List(int))
:return: matrix
"""
if len(matrix[0]) == 0:
return matrix
for i in range(len(matrix)):
j = i + 1
while j < len(matrix[0]):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
j += 1
for i in range(len(matrix)):
# print(matrix[i])
matrix[i].reverse()
# print(matrix[i])
# matrix.reverse()
# print(matrix)
return matrix

参考资料

CSDN Blog – 二维数组旋转90度(by @lynne233)

End~


CATALOG
  1. 1. 问题
  2. 2. 附加要求
  3. 3. 解法
    1. 3.1. 1. 使用额外的空间
    2. 3.2. 2. 在原矩阵上进行操作
  4. 4. 参考资料