给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
我思路:
1.从第一行生成到第k行(下标k)在输出
2.递归 ,每个元素调用L[i]=L[i-1][j-1]+L[i-1][j]
3.由于每行都是对称的,所以生成一半就可以了
处理边元素:若不存在(下标溢出则结束这边的递回)
个数:L[i]有i+1个元素
class Solution(object):
def getRow(self, rowIndex):
L=[]
for j in range((rowIndex)/2+1):
L.append(self.theL(rowIndex,j))
for j in range((rowIndex-1)/2,-1,-1):#从后向前取,不取中点
L.append(L[j])
return L
def theL(self,i,j):
#停止递归的条件
#当下标在边缘值,直接用return 截断,则不会产生下标溢出
if i==j==0:
return 1
if i == 0:
return 0
if j==0:
return 1
if j==i:
return 1
return self.theL(i-1,j-1)+self.theL(i-1,j)
超时
他人:
1.逐行求出来
class Solution(object):
def getRow(self, rowIndex):
#因为不用保存之前的行,所以可以直接在当前行修改
cur=[]
for i in range(rowIndex+1):
cur.append(1)
#复制过来后,从倒数第二个元素开始后向前更新
for j in range(i-1,0,-1):
cur[j]=cur[j]+cur[j-1]
return cur
2.别人的递归
class Solution(object):
def getRow(self, rowIndex):
L=[]
if rowIndex==0:
return [1]
parent=self.getRow(rowIndex-1)
#已经拿到上一行数据
L.append(1)
for j in range(1,rowIndex):#从第一个到倒数第二个,逐个生成本行各元素
result= parent[j]+parent[j-1]
L.append(result)
L.append(1)
return L
区别:我的在递归生成每个元素(横向和纵向都要伸展),他的是递归一行一行的生成