杨辉三角形可以用递推来做
杨辉三角形1
给定一个非负整数 numRows
,生成「杨辉三角」的前 numRows
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
代码
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
n=[]
for i in range(1,numRows+1):
n.append([1]*i)
for i in range(2,len(n)):
for j in range(1,len(n[i])-1):
n[i][j]=n[i-1][j]+n[i-1][j-1]
return n
杨辉三角形2
给定一个非负索引 rowIndex
,返回「杨辉三角」的第 rowIndex
行。
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
# 初始条件
if rowIndex == 0:
return [1]
elif rowIndex == 1:
return [1, 1]
# 初始化第一行
list = [1, 1]
# 计算第2行到rowIndex行的每一行
for i in range(2, rowIndex + 1):
list1 = [1] # 每一行开头是1
for j in range(1, i): # 生成中间元素
list1.append(list[j] + list[j - 1])
list1.append(1) # 每一行结尾是1
list = list1 # 更新到下一行
return list
这个解法的空间复杂度为O(rowIndex
^2),可以进行优化,
空间复杂度为O(rowIndex
)
优化版本
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
# 初始化第 rowIndex 行,每个位置初始为 1
# 因为杨辉三角的每一行的第一个和最后一个元素永远是 1
row = [1] * (rowIndex + 1)
# 从第 2 行开始生成杨辉三角
# 我们只需要计算第 2 行及之后的行
for i in range(2, rowIndex + 1):
# 从右向左更新元素,避免覆盖掉还未使用的值
# 我们从 i-1 开始,更新到第 1 个位置
for j in range(i - 1, 0, -1):
# 递推公式:row[j] = row[j] + row[j-1]
# 相当于在当前位置累加上一行相邻的两个元素
row[j] += row[j - 1]
# 最终返回 row,代表第 rowIndex 行
return row