链接:https://leetcode-cn.com/problems/pascals-triangle-ii/
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
进阶:你可以优化你的算法到 O(k) 空间复杂度吗?
《杨辉三角 II》的思路和《杨辉三角》的思路是一样的,不同是《杨辉三角》需要把结果全部取出来,而《杨辉三角 II》只取固定的行。
具体思路和解法请点击这里噢: LeetCode动态规划:118.杨辉三角
但是因为上述解法的时间复杂度和空间复杂度都是 O(n^2),所以我们可以优化一下。
Python:
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
dp=[[0]* i for i in range(1,rowIndex+2)] # 注意:这里是 rowIndex+2 噢。
for i in range(rowIndex+1):
dp[i][0]=dp[i][-1]=1
for i in range(rowIndex+1):
for j in range(i+1):
if dp[i][j]==0:
dp[i][j]=dp[i-1][j-1]+dp[i-1][j]
return dp[rowIndex]
当前行第 index 项的计算只与上一行第 index-1 项及第 index 项有关。
时间复杂度:O(n^2)
空间复杂度:O(n)
Python:
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
dp = [1] * (rowIndex+1)
for i in range(2, rowIndex+1):
for j in range(1, i):
index = i-j
dp[index] = dp[index] + dp[index-1]
return dp
Go:
func getRow(rowIndex int) []int {
dp:=make([]int,rowIndex+1)
dp[0]=1
for i:=1;i<=rowIndex;i++{
for j:=i;j>0;j--{
dp[j]+=dp[j-1]
}
}
return dp
}
如果大家觉得文章不错,可以关注下我噢,会定期分享的。