题目描述
示例
思路及算法
方法一:先算出杨辉三角的前k+1行,再返回第k行
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
if rowIndex == 0:
return [1]
res = [[1]]
while len(res) < (rowIndex + 1):
new_row = [a + b for a, b in zip([0] + res[-1], res[-1] + [0])]
res.append(new_row)
return res[-1]
优化:滚动数组
注意到对第i+1行的计算仅用到了第i行的数据,因此可以使用【滚动数组】的思想优化空间复杂度。此方法只用两个数组。
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
pre = list() # 前一行数据
for i in range(rowIndex + 1):
cur = list()
for j in range(i + 1):
if j == 0 or j == i:
cur.append(1)
else:
cur.append(pre[j-1] + pre[j])
pre = cur
return pre
进一步优化:只用一个数组
根据杨辉三角的递推式,当前行第i项的计算只与上一行第i-1项及第i项有关。因此我们可以从当前行的尾部开始计算当前行,这样计算到第i项时,第i-1项仍然是上一行的值。
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
row = list()
row.append(1)
for i in range(1, rowIndex + 1):
row.append(0) # 每行都比上一行多一个数
for j in range(i, 0, -1):
row[j] = row[j] + row[j-1]
return row