181.杨辉三角II
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
进阶:
你可以优化你的算法到 O(k) 空间复杂度吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路1:
用杨辉三角I中的方法
程序代码1:
class Solution:
def getRow(self, rowIndex):
dp = [[0] * n for n in range(1, rowIndex + 2)]
for i in range(rowIndex+1):
dp[i][0] = dp[i][-1] = 1
for i in range(0, 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[-1]
s = Solution()
print(s.getRow(3))
解题思路2:
比如 [1,3,3,1],它的下一行为 [1,4,6,4,1],可以先将 [1,3,3,1]前面加一个0,然后计算 [0+1,1+3,3+3,3+1,1],最后一个1不变。
1.确定状态:
- dp[j]是指一行中的第j个数字
2.转移方程:
3.边界情况:
- 初始化为1
程序代码2:
class Solution:
def getRow(self, rowIndex):
dp = [1]
for i in range(1, rowIndex + 1):
dp.insert(0, 0)
for j in range(i):
dp[j] = dp[j] + dp[j + 1]
return dp
s = Solution()
print(s.getRow(4))
解题思路3:
用pre保存上一行的结果,用now计算这一行的结果,除了边界是1,中间的第 i 个数一直都是前一行第 i -1 个数加上前一行第 i 个数。
1.确定状态:
- now[i]是指一行中的第i个数字
2.转移方程:
3.边界情况:
- 初始化为1
程序代码3:
class Solution:
def getRow(self, rowIndex):
for i in range(rowIndex+1):
now = [1]*(i+1)
for i in range(1,i):
now[i] = pre[i-1] + pre[i]
pre = now
return now
s = Solution()
print(s.getRow(3))