返回

让 LeetCode 的螺旋矩阵翩翩起舞——上下左右四指针辅助法

前端

螺旋矩阵是一种将矩阵元素按照顺时针方向从外到内依次排列的矩阵。它不仅在数学和计算机科学中有着广泛的应用,而且也是 LeetCode 上一道经典的面试题。本文将为您揭示螺旋矩阵问题的解题思路,并通过上下左右四指针辅助法为您提供一种清晰易懂的解决方案。

解题思路

螺旋矩阵问题的解题关键在于如何巧妙地移动指针以实现矩阵元素的顺时针排列。为此,我们可以使用四个指针,分别指向矩阵的左上角、右上角、右下角和左下角。然后,按照顺时针方向进行遍历,分别是从左到右、从上到下、从右到左、从下到上的思路。一轮循环后,让左指针+1,继续下一轮循环。需要注意的是,每次移动指针的时候,我们都需要对矩阵边界进行判断,以确保指针不会超出矩阵范围。

算法实现

def spiral_matrix(matrix):
    """
    :type matrix: List[List[int]]
    :rtype: List[int]
    """
    if not matrix:
        return []

    top, bottom, left, right = 0, len(matrix) - 1, 0, len(matrix[0]) - 1
    direction = 0  # 0: right, 1: down, 2: left, 3: up
    result = []

    while top <= bottom and left <= right:
        if direction == 0:
            for i in range(left, right + 1):
                result.append(matrix[top][i])
            top += 1
        elif direction == 1:
            for i in range(top, bottom + 1):
                result.append(matrix[i][right])
            right -= 1
        elif direction == 2:
            for i in range(right, left - 1, -1):
                result.append(matrix[bottom][i])
            bottom -= 1
        elif direction == 3:
            for i in range(bottom, top - 1, -1):
                result.append(matrix[i][left])
            left += 1

        direction = (direction + 1) % 4

    return result

代码解析

  • 我们首先定义了四个变量:topbottomleftright,分别指向矩阵的左上角、右上角、右下角和左下角。

  • 接着,我们定义了一个名为 direction 的变量,用于指示当前的遍历方向。它可以取四个值:0(右)、1(下)、2(左)和 3(上)。

  • 然后,我们定义了一个名为 result 的列表,用于存储螺旋矩阵的元素。

  • 接下来,我们使用一个 while 循环来遍历矩阵。循环条件是 top <= bottomleft <= right,即当矩阵还有元素未被遍历时,循环继续。

  • 在循环体内,我们根据 direction 的值来确定当前的遍历方向,并使用嵌套循环来遍历该方向上的元素。

  • 当一轮循环结束后,我们将 direction 的值加 1,然后对 4 取余,以得到下一个遍历方向。

  • 最后,我们将 result 列表返回,即螺旋矩阵的元素。

结语

螺旋矩阵问题是 LeetCode 上一道经典的面试题,也是算法学习的必备题目之一。通过上下左右四指针辅助法,我们可以清晰地理解解题思路,并轻松地实现算法代码。希望本文对您的 LeetCode 学习之旅有所帮助!