返回

螺旋矩阵的优美漫步

后端

矩阵的螺旋探险

想象自己站在一个矩阵的中心,四面八方都是数字。你的任务是按照顺时针螺旋顺序,依次踏遍矩阵中的每个数字。

如何实现这一目标?我们需要一种算法,它能引导我们沿着矩阵的边缘行进,同时巧妙地向内收缩,直到到达中心。

算法精髓

算法的关键在于理解矩阵的遍历顺序。我们可以将矩阵想象成一个洋葱,从外层开始,逐层剥离。每层都有一个确定的遍历方向,右、下、左、上,依次循环。

步骤详解

  1. 初始化

    • 设置当前位置为矩阵中心。
    • 初始化四个边界值:上边界、下边界、左边界、右边界。
  2. 遍历

    • 向右 :从左边界开始,向右移动,直到达到右边界。
    • 向下 :从右边界开始,向下移动,直到达到下边界。
    • 向左 :从下边界开始,向左移动,直到达到左边界。
    • 向上 :从左边界开始,向上移动,直到达到上边界。
  3. 边界收缩

    • 每完成一圈,四个边界都会向内收缩一个单位。
    • 更新上边界、下边界、左边界、右边界。
  4. 重复

    • 重复步骤 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

结语

螺旋矩阵算法是一种优雅的技巧,它将矩阵遍历问题转化为一个井然有序的步骤序列。通过巧妙的边界收缩机制,我们能够从矩阵中提取出隐藏的信息。希望这篇文章能为你提供解决此类问题的灵感,让你在编程的旅途中不断进步。