LeetCode#119. 杨辉三角 II

86 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

一、题目描述:

119. 杨辉三角 II - 力扣(LeetCode) (leetcode-cn.com)   给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex **行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

1626927345-DZmfxB-PascalTriangleAnimated2.gif

示例 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)