返回

从递推到优化,解密力扣118:杨辉三角,层层推进!

后端

力扣118:杨辉三角

一、题目

给定一个非负整数numRows,生成「杨辉三角」的前numRows行。

在杨辉三角中,每个数是它左上方和右上方的数的总和。

示例 1:

输入:numRows = 5
输出:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

示例 2:

输入:numRows = 1
输出:[[1]]

二、解题思路

  1. 递推法

杨辉三角的构建遵循一定的递推关系,即每一行的每个数都等于其左上方和右上方的数之和。因此,我们可以使用一个二维数组来存储杨辉三角,并逐行进行递推计算。

def generate(numRows):
    # 创建一个二维数组来存储杨辉三角
    triangle = [[1]]

    # 逐行进行递推计算
    for i in range(1, numRows):
        # 创建当前行的列表
        current_row = [1]

        # 循环计算当前行的每个数
        for j in range(1, i):
            # 当前数等于其左上方和右上方的数之和
            current_row.append(triangle[i-1][j-1] + triangle[i-1][j])

        # 将当前行添加到二维数组中
        current_row.append(1)
        triangle.append(current_row)

    # 返回杨辉三角
    return triangle
  1. 动态规划法

动态规划法与递推法类似,但它使用一个一维数组来存储杨辉三角的每一行,从而减少了空间复杂度。

def generate(numRows):
    # 创建一个一维数组来存储杨辉三角的每一行
    triangle = [1]

    # 逐行进行递推计算
    for i in range(1, numRows):
        # 创建当前行的列表
        current_row = [1]

        # 循环计算当前行的每个数
        for j in range(1, i):
            # 当前数等于其左上方和右上方的数之和
            current_row.append(triangle[j-1] + triangle[j])

        # 将当前行添加到一维数组中
        current_row.append(1)
        triangle = current_row

    # 返回杨辉三角
    return triangle

三、复杂度分析

  • 时间复杂度:

递推法和动态规划法的时间复杂度均为O(n^2),其中n为numRows。

  • 空间复杂度:

递推法和动态规划法的空间复杂度分别为O(n^2)和O(n)。

四、总结

杨辉三角的构建是一个经典的动态规划问题,我们可以使用递推法或动态规划法来解决。这两种方法的时间复杂度均为O(n^2),但动态规划法的空间复杂度更低,为O(n)。