刷题系列 - 给出一个帕斯卡三角的行数,返回该行元素,要求复杂度为K(O)

这道题让我深深感觉数学才是算法的核心,不对,是爸爸。


简单说下题目,帕斯卡三角,如下图,从第三行开始,除了两边的1,其他元素都是上一行两个左右元素之后,比如第三行的中间的2,就是上面两个1之和。

如果第一行为0行,那么给出行数,返回该行所有元素,比如给出3,返回[1,3,3,1]

关于帕斯卡三角,还是很多有趣属性,可以搜索,最主要就是和二项式展开系数的关系。


如果不考虑算法复杂度,其实只要从第一行开始一行一行算下来即可,这样无论如何就要两次循环嵌套,复杂度是K(O^2)。

如果要K(O)一次循环的复杂度,就要思考下数学联系了,后面实在想不出搜索下。发现关系如下:

                                    即第n行第i个(n,i 从 0 开始)是C(i,n),组合计算公式:

                                    

                                    化简得 : C(i,n) = n * ( n -1) * ... * ( n - i +1) / ( 1 * 2 * ... * i )


惭愧,我的代码基本就是他的python版本。https://zhuanlan.zhihu.com/p/42302550

可能稍微优化地方是,这里先创建了一个行数加以长度的0值队列,这个也是帕斯卡三角的属性,每一行的元素数是行数加一;因为帕斯卡三角元素是前后对称,每次就计算前面一个,同时更新前后对称两个;当队列所有元素不为0时候,返回该队列即是答案。这样就只用遍历一半即可。

代码如下

class Solution:
    def getRow(self, rowIndex: int) -> List[int]:
        rowList = [0 for x in range(rowIndex+1)]
        m = 1
        for i in range(len(rowList)): 
            if i == 0:
                rowList[0] =1 
                rowList[rowIndex] = 1
            elif rowList[i] != 0:
                return rowList
            else:
                m = int(m*(rowIndex-i+1)/i)
                rowList[i] = m
                rowList[rowIndex - i] = m
        return rowList



请使用浏览器的分享功能分享到微信等