54 螺旋矩阵
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
解法
- 回溯
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if len(matrix)==0: return []
m,n = len(matrix),len(matrix[0])
memo = [[False for _ in range(n)] for _ in range(m)]
cur_i,cur_j = 0,0
dire = [[0,1],[1,0],[0,-1],[-1,0]]
index = 0
res = []
for i in range(m*n):
res.append(matrix[cur_i][cur_j])
memo[cur_i][cur_j] = True
nex_i, nex_j = cur_i+dire[index][0],cur_j+dire[index][1]
if (0<=nex_i<m) and (0<=nex_j<n) and memo[nex_i][nex_j]==False:
cur_i,cur_j = nex_i,nex_j
else:
index = (index+1)%4
cur_i, cur_j = cur_i+dire[index][0],cur_j+dire[index][1]
return res
- 递归
每次打印矩阵最外层的元素,直至矩阵为空。
- 输出矩阵一行,然后去掉第一行,转置矩阵,重复上述操作
#### 例如
'''
[
[1,2,3],
[4,5,6],
[7,8,9]
]
输出第一行 [1,2,3]
反转
[[4,5,6], ---> [[6,9],
[7,8,9]] [5,8],
[4,7]]
第一行,[6,9]
反转
[[5,8], ---> [[8,7],
[4,7]] [5,4]]
第一行 [8,7]
...
'''
## python中list(zip(*matrix))用法
>>> ls
[[34, 21, 13], [1, 1, 8], [2, 3, 5]]
>>> list(zip(*ls))
[(34, 1, 2), (21, 1, 3), (13, 8, 5)]