返回
螺旋矩阵的优美漫步
后端
2024-02-28 09:14:34
矩阵的螺旋探险
想象自己站在一个矩阵的中心,四面八方都是数字。你的任务是按照顺时针螺旋顺序,依次踏遍矩阵中的每个数字。
如何实现这一目标?我们需要一种算法,它能引导我们沿着矩阵的边缘行进,同时巧妙地向内收缩,直到到达中心。
算法精髓
算法的关键在于理解矩阵的遍历顺序。我们可以将矩阵想象成一个洋葱,从外层开始,逐层剥离。每层都有一个确定的遍历方向,右、下、左、上,依次循环。
步骤详解
-
初始化 :
- 设置当前位置为矩阵中心。
- 初始化四个边界值:上边界、下边界、左边界、右边界。
-
遍历 :
- 向右 :从左边界开始,向右移动,直到达到右边界。
- 向下 :从右边界开始,向下移动,直到达到下边界。
- 向左 :从下边界开始,向左移动,直到达到左边界。
- 向上 :从左边界开始,向上移动,直到达到上边界。
-
边界收缩 :
- 每完成一圈,四个边界都会向内收缩一个单位。
- 更新上边界、下边界、左边界、右边界。
-
重复 :
- 重复步骤 2 和 3,直到当前位置到达矩阵中心。
代码示例
def spiralOrder(matrix):
if not matrix:
return []
m, n = len(matrix), len(matrix[0])
result = []
left, right, top, bottom = 0, n - 1, 0, m - 1
while left <= right and top <= bottom:
# 向右
for i in range(left, right + 1):
result.append(matrix[top][i])
# 向下
for i in range(top + 1, bottom):
result.append(matrix[i][right])
# 向左(如果上下边界相等,则不向左遍历)
if top < bottom:
for i in range(right, left - 1, -1):
result.append(matrix[bottom][i])
# 向上(如果左右边界相等,则不向上遍历)
if left < right:
for i in range(bottom - 1, top, -1):
result.append(matrix[i][left])
left += 1
right -= 1
top += 1
bottom -= 1
return result
结语
螺旋矩阵算法是一种优雅的技巧,它将矩阵遍历问题转化为一个井然有序的步骤序列。通过巧妙的边界收缩机制,我们能够从矩阵中提取出隐藏的信息。希望这篇文章能为你提供解决此类问题的灵感,让你在编程的旅途中不断进步。