题目描述
示例
思路及算法
方法一:数学
依据杨辉三角形的性质之一:每个数字等于上一行的左右两个数字之和,如果用ret列表来代表已计算好的部分杨辉三角形,用row列表表示第n行数字,那么此性质可表示为: row[i] = ret[n-1][i-1] + ret[n-1][i]。
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
ret = list() # ret代表已计算出的部分杨辉三角
for i in range(numRows): # i代表每行
row = list() # 每行用一个row列表来表示
for j in range(i + 1): # 第i行有i+1个数,j表示每一行的第j个数
if j == 0 or j == i:
row.append(1)
else:
row.append(ret[i-1][j] + ret[i-1][j-1])
ret.append(row)
return ret
取巧解法:错一位再逐个相加
可以观察到一个规律:当前一行只比上一行多了一个元素,而且 本行元素=上一行元素往后错一位在逐个相加。因此我们只要对最后一行单独处理:最后一行首、尾分别添加一个零,然后对应位置求和就可以得到新的一行。
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
if numRows == 0:
return []
res = [[1]]
while len(res) < numRows:
new_row = [a + b for a,b in zip([0] + res[-1], res[-1] + [0])]
res.append(new_row)
return res