题目描述:
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
进阶:
你可以优化你的算法到 O(k) 空间复杂度吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
动态规划:
杨辉三角的递推关系明显:
f(i,j) = f(i-1,j-1)+f(i-1,j)
考虑到O(k)的空间复杂度,将所有的变化放入同一个数组。第i行的数据由第0行开始演变。
代码如下:
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
res = [1 for _ in range(rowIndex+1)]
for i in range(rowIndex+1):
for j in range(i-1,0,-1):
res[j] = res[j]+res[j-1]
return res
测试结果:
时间复杂度:O(k^2)
空间复杂度:O(k)
总结:
将整个变化过程考虑在一个数组内是一个比较发散的思路。虽然实现过后看起来很简单,但是分析过程的时候,很容易单纯考虑递推关系构建二维数组,然后取最后一行。