携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
一、题目描述:
119. 杨辉三角 II - 力扣(LeetCode) (leetcode-cn.com)
给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex **行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: rowIndex = 3
输出: [1,3,3,1]
示例 2:
输入: rowIndex = 0
输出: [1]
示例 3:
输入: rowIndex = 1
输出: [1,1]
提示:
- 0 <= rowIndex <= 33
二、思路分析:
杨辉三角-I 要求输出整个列表,可以通过前一行得到当前行的解,那种方式方便还容易理解;但是单独输出一行的子列表,个人认为用通项公式求解方便。
可以简单写一下,不难发现,每一行就是二项式展开的系数:C(m,n) = A(m,n) / m!(百度一下二项式展开系数或排列组合公式)
三、AC 代码:
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
'''
Input : rowIndex
Output : 返回杨辉三角的第 k 行
· 初始化杨辉三角ans矩阵(构建ans形状),用 0 填充
· 初始化边界值 ,都为1
· 填充值,公式:C(k,n) = n!/(k!(n-k)!)
'''
# 初始化杨辉三角ans(构建ans形状)用 0 填充,第rowIndex行的列表长度为rowIndex+1
ans = [0] * (rowIndex + 1)
# 初始化两个边界值
ans[0] = ans[-1] = 1
# 填充 rowIndex >= 2时的 0 的位置
if rowIndex >= 2:
for i in range(1, rowIndex):
n = rowIndex
mol = 1 # 分子
deno = 1 # 分母
for j in range(1, i+1):
mol *= n # 分母的连乘
deno *= j # 分子的连乘
n -= 1
ans[i] = int(mol / deno) # 这里需要转换为整型
return ans
四、总结:
通过对杨辉三角的观察不难看出, 杨辉三角每行仅比上一行多一位, 当前行的size为k, 那么只有1~k-1是需要更新的
范文参考:
「手画图解」多解法:动态规划、递归、记忆化递归 |119.杨辉三角II - 杨辉三角 II - 力扣(LeetCode)