题目
给定一个非负整数
numRows
,生成「杨辉三角」的前numRows
行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。
输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
我的题解
使用python 特性:yield生成器。
triangle(n) 函数是用来生成n行的row,使用yield是考虑到前后行间有关系。triangle生成的行,再由generate(numRows)读入并装入列表中,最终返回一个二维列表。
要注意,返回的是一个二维数组。 在写代码的时候,要注意引用和拷贝的问题。
Python 列表切片陷阱:引用、拷贝与深拷贝 - NaN不等于NaN - 博客园
列表的append是引用,列表+-是拷贝。
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
res=[]
for i in self.triangle(numRows):
res.append(i)
return res
def triangle(self,n):
row1=[1]
row2=[1,1]
count=1
while count<=n:
if count==1:
row=row1
elif count==2:
row=row2
else:
pre=row
row=[1]
for i in range(1,count-1):
row.append(pre[i]+pre[i-1])
row.append(1)
count +=1
yield row
Accepted
- 14/14 cases passed (24 ms)
- Your runtime beats 96.61 % of python3 submissions
- Your memory usage beats 25.13 % of python3 submissions (15 MB)
由于代码有点长,我们减少一下代码。注意pre=row[:]是切片浅拷贝。
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
res=[]
for i in self.triangle(numRows):
res.append(i)
return res
def triangle(self,n):
row=[1]
count=1
while count<=n:
yield row
count +=1
if count >2:
pre=row[:]
for i in range(1,count-2):
row[i]=pre[i]+pre[i-1]
row=row+[1]
不够简洁,看到了别人的yield。改了一下。列表生成器真好用。
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
res=[]
for i in self.triangle(numRows):
res.append(i)
return res
def triangle(self,n):
row=[1]
count=1
while count<=n:
yield row
row=[1]+[row[i]+row[i+1] for i in range(len(row)-1)]+[1]
count+=1
Accepted
- 14/14 cases passed (28 ms)
- Your runtime beats 87.14 % of python3 submissions
- Your memory usage beats 43.26 % of python3 submissions (15 MB)