题目描述
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
题目地址:https://leetcode-cn.com/problems/spiral-matrix/
要点分析
- 需要转变方向右两种情况,一是下一步超越矩阵边界,二是下一步到达已遍历的元素,排除掉这两种情况即可;
- 转变方向可以通过实现方向数组,对已遍历的的元素进行标记;
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
# 考虑空矩阵情况
if not matrix: return []
ans = []
m,n = len(matrix),len(matrix[0])
# 构建是否遍历的标记矩阵
temp = [[False] * n for i in range(m)]
# 从(0,0)出发
r,c = 0,0
# 初始化旋转方向
di = 0
# 初始化旋转矩阵
# 两两组合分别代表向右,向下,向左,向上
dr = [0,1,0,-1]
dc = [1,0,-1,0]
for x in range(m*n):
ans.append(matrix[r][c])
temp[r][c] = True
nr, nc = r + dr[di], c + dc[di]
# 若下一步不越界且未遍历过
if 0 <= nr < m and 0 <= nc < n and not temp[nr][nc]:
r,c = nr, nc
else:
di = (di+1)%4
r, c = r + dr[di], c + dc[di]
return ans
方法二:转置矩阵
在题解区看到的方法,太简洁了。
思路就是pop掉matrix的头后进行转置,重复操作。
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res = []
while matrix:
res += matrix.pop(0)
matrix = list(map(list, zip(*matrix)))[::-1]
return res
- zip()函数将可迭代的参数对应的元素打包成元组,返回元组组成的列表 。参数为矩阵时可理解为转置。