旋转矩阵是顺时针打印矩阵的前提。首先,学会旋转矩阵,后面就容易了。
1.旋转矩阵:如下所示,旋转效果
[[1,2,3], [[7,4,1],
[4,5,6], ---> [8,5,2],
[7,8,9]] [9,6,3]]
技巧:使用zip
代码:这里*解包,zip压缩,zip后变成zip类型,zip会把原有矩阵从第一列开始,把每一列打包成一个元祖,把元祖强转为list达到矩阵转置的效果
def tans90(matrix):
matrix = matrix[::-1]
res = []
for line in zip(*matrix):
print('line = ',line)
输入:[[1,2,3],[4,5,6],[7,8,9]]
输出:
line = (7, 4, 1)
line = (8, 5, 2)
line = (9, 6, 3)
这样就实现了一个矩阵的旋转(顺时针)
-------------------------------------------------------------------------------------------------------------------
2.顺时针打印矩阵,可以利用上面的方法,并把顺序打印出来,即:1-2-3-6-9-8-7-4-5.
代码:
def spiralOrder(matrix):
res = []
while matrix:
print('matrix = ',matrix)
res += matrix.pop(0)
matrix = list(zip(*matrix))[::-1]
return res
输出并显示每次matrix:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
matrix = [(6, 9), (5, 8), (4, 7)]
matrix = [(8, 7), (5, 4)]
matrix = [(4,), (5,)]
matrix = [(5,)]
res = [1, 2, 3, 6, 9, 8, 7, 4, 5]
递归的方法(leetcode,一行实现):
def spiralOrder( matrix):
return (matrix and list(matrix.pop(0)) +
spiralOrder(list(zip(*matrix))[::-1]))
---------------------------------------------------------------------------------------------------------------------------
3.逆时针打印:同理,使用顺时针旋转,得到的数值再逆即可。
代码:
def anti(matrix):
res = []
res += matrix.pop(0)[::-1]
while matrix:
matrix = matrix[::-1]
matrix = list(zip(*matrix))
print('msss=',matrix)
res += list(matrix.pop(0))[::-1]
return res
打印输出:
msss= [(7, 4), (8, 5), (9, 6)]
msss= [(9, 8), (6, 5)]
msss= [(6,), (5,)]
msss= [(5,)]
最后输出:
[3, 2, 1, 4, 7, 8, 9, 6, 5]