返回
从递推到优化,解密力扣118:杨辉三角,层层推进!
后端
2024-01-21 15:25:25
力扣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]]
二、解题思路
- 递推法
杨辉三角的构建遵循一定的递推关系,即每一行的每个数都等于其左上方和右上方的数之和。因此,我们可以使用一个二维数组来存储杨辉三角,并逐行进行递推计算。
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
- 动态规划法
动态规划法与递推法类似,但它使用一个一维数组来存储杨辉三角的每一行,从而减少了空间复杂度。
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)。