题目链接:https://leetcode.com/problems/pascals-triangle/
Given numRows, generate the first numRows of Pascal's triangle.
For example, given numRows = 5,
Return
[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]
思路:本题是根据一个数返回杨辉三角。根据杨辉三角的性质可以知道,一行的值是对称的,并且为
C(n,0), C(n, 1), C(n, 2), C(n, 3),.... , C(n, n-1), C(n, n)
由于对称,所以只需要计算一半。
C(n, 0) = 1
C(n, 1) = n/1
C(n, 2) = n*(n-1)/(1*2)
C(n, 3) = n*(n-1)(n-2)/(1*2*3)
....
因此可以得出规律,每一项分子增加一个数,分母增加一个数,即可直接产生出一行的每一个数。
但是要注意有个坑,就是分子有可能乘积整型溢出,因此可以让分母为long型,就会将结果自动转型为long,这样就不会溢出了。
long int在64位机器上是8字节,32位机器是4字节,因此leetcode的后台估计是64位的吧。
时间复杂度为O(n), 不需要额外的空间
代码如下:
class Solution { public: vector<vector<int>> generate(int numRows) { vector<vector<int>> result; for(int i = 0; i < numRows; i++) { vector<int> tem(i+1, 1); for(long int j = 1; j <= i/2; j++) tem[j] = tem[i-j] = tem[j-1]*(i-j+1)/j; result.push_back(tem); } return result; } };