题目
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
思路
按照杨辉三角计算的方法考虑,代码如下:
class Solution:
def generate(self, numRows):
"""
:type numRows: int
:rtype: List[List[int]]
"""
l1 = [1] #记录当前层的list
l2 = [] #总的list
if numRows<=0: # 如果小于等于0,则返回空的list
return l2
for i in range(numRows):
l2.append(l1)
l = l1 #l是记录上一层的list
l1 = [1] # 每一层的最开始都是1
for j in range(len(l)-1):
a = l[j]+l[j+1]
l1.append(a)
l1.append(1) #每一层的最后都是1
return l2
学习他人代码
看到用时最短的代码,写得非常简洁,如下:
class Solution:
def generate(self, numRows):
"""
:type numRows: int
:rtype: List[List[int]]
"""
res = [[1]] #1
for i in range(1,numRows): #2
res.append(list(map(lambda x, y : x + y, res[-1]+[0], [0]+res[-1]))) #3
return res[:numRows] #4
解释第3行,这句话的结果是在res的最后面添加一个list,运用map函数:map(function, iterable, …),
lambda是匿名函数,x取值来自res[-1]+[0],其中res[-1]+[0]是取出res的最后一个元素,当然也是一个list,然后在这个list后面加上一个0;y取值来自[0]+res[-1],其中[0]+res[-1])是取出res的最后一个元素,当然也是一个list,然后在这个list前面加上一个0
例如初始res为[[1]],则res[-1]+[0]为[1,0],res[-1]+[0]为[0,1],x+y , 经过map函数得到的list是[1,1],res为[[1],[1,1]]