54. 螺旋矩阵
程序员文章站
2022-07-12 09:54:51
...
题目描述
给定一个包含 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]
解析
模拟访问路径, (dx[di], dy[di])
表示下一步要走的方向, 当超过边界(比如示例中的4
的位置,如果不转方向,就会超过边界),或者访问到访问过的位置(比如示例中5
的位置,如果不转方向,就会又回到1
访问过得位置),就要改变方向
我的代码
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix: return []
H, W = len(matrix), len(matrix[0])
visited = [[False] * W for _ in range(H)]
res = []
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
x = y = di = 0
for _ in range(H * W):
res.append(matrix[x][y])
visited[x][y] = True
rx, ry = x + dx[di], y + dy[di] # 下一步要走的位置
if 0 <= rx < H and 0 <= ry < W and not visited[rx][ry]: # 如果没有超过边界和访问到访问的位置
x, y = rx, ry
else:
di = (di + 1) % 4 # 不然就改变方向
x, y = x + dx[di], y + dy[di]
return res