[leetcode] Pascal's Triangle 解题报告

题目链接: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;
    }
};


你可能感兴趣的:(LeetCode,array,数组)