要求:给一个n×n的数组,旋转90度。
手动画个丑图:
image.png
简单思路(顺时针):
如图四个红框为一个layer,每次旋转一个layer,layer的范围是(0,len(nums)/2)
在第一个layer循环中,要将四角的元素按一下顺序旋转(0,0)转到(0,3)转到(3,3)转到(3,0)转到(0,0)
如果直接按照这个顺序,前一个值会将后一个值直接覆盖掉,所以先用一个临时的tmp将首个元素存起来,然后按照
(3,0)转到(0,0)
(3,3)转到(3,0)
(0,3)转到(3,3)
(0,0)转到(0,3)
tmp转到(0,0)
这样的顺序旋转。
first是每个红框中的第一个元素,last为最后一个。
offset记录了当前旋转到了红框中的第几个元素。
完整代码:
def rotate(matrix):
n = len(matrix)
for laryer in range(0, n / 2):
first = laryer
last = n - 1 - laryer
for i in range(first, last):
offset = i - first
tmp = matrix[first][i]
# 左侧一列移到顶部
matrix[first][i] = matrix[last - offset][first]
# 底部一行移到左侧
matrix[last - offset][first] = matrix[last][last - offset]
# 右侧一列移到底部
matrix[last][last - offset] = matrix[i][last]
# 顶部一行移到右侧
matrix[i][last] = tmp
return matrix
矩阵(测试用例):
matrix = [[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]]
输出:
image.png
网友评论