返回

每日算法题解:以螺旋矩阵的方式遍历矩阵元素

前端

引言

在计算机科学领域,算法题每日一练是一个广受欢迎的学习方式,可以帮助程序员提升解决问题的能力和算法素养。本文将着重解析算法题每日一练第64天的问题,即在给定矩阵的情况下,以顺时针螺旋顺序返回矩阵中的所有元素。

问题

给你一个 m 行 n 列的矩阵 matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。

模拟思想

解决本题的关键在于模拟矩阵的螺旋遍历过程。具体来说,我们可以将矩阵视为一个二维平面,并按照以下步骤进行遍历:

  1. 初始化: 设定四个指针(top、bottom、left、right)分别指向矩阵的上下左右边界。
  2. 遍历外圈: 从左上角开始,沿着矩阵的外圈顺时针遍历,将遇到的元素依次加入结果数组。
  3. 缩小边界: 遍历完外圈后,将上下左右边界向内缩小一层,更新指针指向新的边界。
  4. 重复遍历: 重复步骤 2 和步骤 3,直到遍历完所有元素。

具体实现

def spiralOrder(matrix):
    if not matrix:
        return []

    m, n = len(matrix), len(matrix[0])
    top, bottom, left, right = 0, m-1, 0, n-1
    result = []

    while top <= bottom and left <= right:
        # 遍历上边界
        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])

        # 缩小边界
        top += 1
        bottom -= 1
        left += 1
        right -= 1

    return result

示例

给定矩阵:

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

以螺旋矩阵方式遍历后的结果为:

[1, 2, 3, 6, 9, 8, 7, 4, 5]

总结

算法题每日一练第64天的题目是一道经典的矩阵遍历问题,考察了模拟思想在算法设计中的应用。通过模拟矩阵的螺旋遍历过程,我们可以高效地返回矩阵中的所有元素。理解本题的解法有助于提升算法思维和解决问题的能力。