NO.54 螺旋矩阵
力扣 No.54 螺旋数组
def spiralOrder(matrix: list[list[int]]) -> list[int]:
di = [(0, 1), (1, 0), (0, -1), (-1, 0)]
idx = 0
m, n = len(matrix), len(matrix[0])
vis = [[False] * n for _ in range(m)]
ans = []
i, j = 0, 0
cur_di = (0, 1)
while True:
if len(ans) == n * m:
break
x, y = cur_di
ans.append(matrix[i][j])
vis[i][j] = True
if 0 <= i + x < m and 0 <= j + y < n and not vis[i + x][j + y]:
i, j = i + x, j + y
else:
idx = (idx + 1) % 4
cur_di = di[idx]
i, j = i + cur_di[0], j + cur_di[1]
return ans
方向数组控制遍历,di = [(0,1), (1,0), (0,-1), (-1,0)] 分别代表右、下、左、上。idx 记录当前方向,cur_di 是当前正在走的方向。
每走一步先把当前格子加入结果,标记已访问。然后检查下一步能不能走——如果在边界内且没走过,就继续往前走;如果走不了(越界或已访问),就换个方向。换方向时 idx +1 取模,拿到新方向,然后用新方向走一步。
这个过程一直重复,直到结果数组长度等于总格子数。
时间复杂度 O(m×n),每个格子只走一次。
总评:用方向数组 + 访问标记的思路很直观,代码写得很清晰。换方向时直接用新方向走一步,避免了旧方向的干扰,这个细节处理得不错。空间上用了 vis 数组,虽然多占点内存,但逻辑简单,适合用来理解螺旋遍历的过程。
NO.54 螺旋矩阵
https://lincodex.cn/index.php/archives/3/