C++ 程序 帕斯卡三角形
帕斯卡三角形是二项式系数的一个三角形数组。编写一个函数,以整数值 n 作为输入,并输出帕斯卡三角形的前 n 行。以下是帕斯卡三角形的前 6 行。
方法 1(O(n ^ 3)时间复杂度)
每行的条目数等于行数。例如,第一行有“1”,第二行有“1 1”,第三行有“1 2 1”,..以此类推。每行中的每个条目是二项式系数的值。第i个入口的值在第line行中是C(line,i)。该值可以使用以下公式计算。
一个简单的方法是运行两个循环并在内循环中计算二项式系数的值。
输出:
附加空间: O(1)
这种方法的时间复杂度是O(n ^ 3)。以下是优化的方法。
方法2(O(n ^ 2)时间和O(n ^ 2)额外空间)
我们观察三角形时会发现,每个条目都是其上方两个值的总和。因此,我们可以创建一个二维数组来存储已生成的值。要在一行中生成一个值,我们可以使用数组中之前存储的值。
输出结果:
此方法可以进行优化,使用O(n)的空间,因为我们只需要上一行的值。因此,我们可以创建一个大小为n的辅助数组并覆盖已有值。以下是使用O(1)空间的另一种方法。
方法3 (时间复杂度O(n^2),空间复杂度O(1))
该方法基于方法1。我们知道第i个条目的行数为line时,二项式系数为C(line、i),所有行都以值1开始。思路是使用C(line、i-1)来计算C(line、i),可以使用以下方法在O(1)的时间内计算。
C(line, i) = line! / ( (line-i)! * i! )
C(line, i-1) = line! / ( (line – i + 1)! * (i-1)! )
我们可以从上面两个式子推导出以下表达式
C(line, i) = C(line, i-1) * (line – i + 1) / i
因此,可以从C(line, i-1)中得出C(line, i)的值。
输出结果:
因此,方法3是所有方法中最好的方法,但对于大的n值,可能会发生整数溢出,因为它会将两个整数相乘以获得值。