返回

解码剑指 Offer 29:逆转矩阵的奥秘

后端

一、算法概述

剑指 Offer 29:顺时针打印矩阵 这道题的目的是将一个给定的矩阵按照从外向里的顺时针顺序依次打印出来。这个算法需要处理矩阵中的每一个元素,并按照特定的规则将其打印出来。

二、算法步骤

  1. 初始化变量

    • 定义四个指针:top、bottom、left、right,分别指向矩阵的顶部、底部、左边和右边。
    • 定义一个结果列表,用于存储打印出的数字。
  2. 打印外圈

    • 循环遍历矩阵的外圈,从左到右、从上到下、从右到左、从下到上,依次打印数字。
    • 在每一圈中,更新 top、bottom、left、right 指针的位置。
  3. 打印内圈

    • 如果矩阵中还有内圈,则重复步骤 2,继续打印内圈的数字。
    • 在每一圈中,更新 top、bottom、left、right 指针的位置。
  4. 返回结果

    • 返回结果列表,其中包含了矩阵中所有数字的顺时针打印结果。

三、示例代码

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
    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

四、时间复杂度和空间复杂度

  • 时间复杂度:O(m * n),其中 m 和 n 分别是矩阵的行数和列数。算法需要遍历矩阵中的每一个元素,因此时间复杂度为 O(m * n)。
  • 空间复杂度:O(1)。算法只需要几个变量来存储指针和结果,因此空间复杂度为 O(1)。

五、总结

在本文中,我们详细解析了 LeetCode 剑指 Offer 29:顺时针打印矩阵这道题,并提供了清晰的思路和示例代码。希望这篇文章能够帮助你理解算法的奥秘,并将其应用到你的编程实践中。如果你有其他问题,欢迎随时留言,我将尽力解答。