给定一个非负索引 rowIndex
,返回「杨辉三角」的第 rowIndex
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
联想到杨辉三角I的题目,可以想到先把杨辉三角每一行构造出来,然后根据已知索引直接索引到那一行。
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
ret = []
k = rowIndex
for i in range(k+1):#索引从0开始,所以行数应加1
row = list()
for j in range(i+1):
if j == 0 or j == i:
row.append(1)#j在开始和结束时,都为1
else:
row.append(ret[i-1][j] + ret[i-1][j-1])#当前值为左上方与右上方数值之和
ret.append(row)#添加每一行的list
return ret[rowIndex]#返回所需行数索引
时间复杂度O(,空间复杂度O(1)。
题解里有大佬@负雪明烛使用其他的空间方法,这里直接贴上解释:
我们只用一个长度为 k 的一维数组。类似于动态规划中滚动数组的思路。
使用一维数组,然后从右向左遍历每个位置,每个位置的元素res[j] += 其左边的元素 res[j - 1]。
为啥不从左向右遍历呢?因为如果从左向右遍历,那么左边的元素已经更新为第 i 行的元素了,而右边的元素需要的是第 i - 1行的元素。故从左向右遍历会破坏元素的状态
class Solution(object):
def getRow(self, rowIndex):
"""
:type rowIndex: int
:rtype: List[int]
"""
res = [1] * (rowIndex + 1)
for i in range(2, rowIndex + 1):
for j in range(i - 1, 0, -1):
res[j] += res[j - 1]
return res
时间复杂度O(),空间复杂度O(k)