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

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

 

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

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

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

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

 

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

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

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

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

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

 

惭愧,我的代码基本就是他的python版本。

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

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
    def getRow(self, rowIndex: int-List[int]:
        rowList = [0 for in range(rowIndex+1)]
        = 1
        for in range(len(rowList)): 
            if == 0:
                rowList[0=1 
                rowList[rowIndex] = 1
            elif rowList[i] != 0:
                return rowList
            else:
                = int(m*(rowIndex-i+1)/i)
                rowList[i] = m
                rowList[rowIndex - i] = m
        return rowList

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

上一篇:模拟赛 2021.9.7 T3


下一篇:Photoshop教程:修饰爱情承诺勾手