题目描述(简单难度)

    118 题 一样,依旧是杨辉三角。区别在于之前是输出所有层的数,这道题只需要输出第 层的数。

    解法一

    118 题 一样,我们只需要一层一层的求。但是不需要把每一层的结果都保存起来,只需要保存上一层的结果,就可以求出当前层的结果了。

    参考 -solution>),其实我们可以优化一下,我们可以把 preList 省去。

    这样的话,cur每次不去新建 List,而是把cur当作pre

    又因为更新当前j的时候,就把之前j的信息覆盖掉了。而更新 的时候又需要之前j的信息,所以在更新前,我们需要一个变量把之前j的信息保存起来。

    区别在于我们用了 set 函数来修改值,由于当前层比上一层多一个元素,所以对于最后一层的元素如果用 set 方法的话会造成越界。此外,每层的第一个元素始终为1。基于这两点,我们把之前j == 0 || j == i的情况移到了for循环外进行处理。

    因为更新完j的信息后,虽然把之前的信息覆盖掉了。但是下一次我们更新的是j - 1,需要的是j - 1j - 2 的信息,j信息覆盖就不会造成影响了。

    解法二 公式法

    如果熟悉杨辉三角,应该记得杨辉三角其实可以看做由组合数构成。

    根据组合数的公式,将(n-k)!约掉,化简就是下边的结果。

    119. Pascal’s Triangle II - 图3

    然后我们就可以利用组合数解决这道题。

    上边的算法对于每个组合数我们都重新求了一遍,但事实上前后的组合数其实是有联系的。

    代码的话,我们只需要用pre变量保存上一次的组合数结果。计算过程中,可能越界,所以用到了long

    这道题其实还是比较简单的,只是优化的两种方法是比较常用的,一种就是用pre变量将要被覆盖的变量存起来,另一种就是倒着进行。另外求组合数的时候,要防止的溢出。

    windliang wechat

    添加好友一起进步~

    如果想系统的学习数据结构和算法,强烈推荐一个我之前学过的课程,可以点击 这里 查看详情