【Leetcode】【Easy】Pascal's 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]
]

解题思路1:迭代插入(未通过)

[              [               [                      [
     [1],           [1],            [1],                   [1],
    [1],           [1,1],          [1,1],                 [1,1]
   [1],   ==>     [1,2],  ==>     [1,2,1], ==>...==>     [1,2,1],
  [1],           [1,3],          [1,3,3],               [1,3,3,1],
 [1]            [1,4]           [1,4,6],               [1,4,6,4,1],
]              [               [                      [

可以推导出每一列的递推公式:

第一列从第一行开始:1                                                                            

第二列从第二行开始:j / 1,  j∈[1,n)

第三列从第三行开始:[j*(j-1)] / [1*2], j∈[2,n)

...

第M列从第M行开始:[j*(j-1)*...*(j-m+2)] / [1*2*...*m-1], j∈[m,n)

但是程序未能实现,在输入numRows=8时,出现Runtime Error错误。

【★】解题思路2:

用f(n)(m)表示第n行第m个元素,n从1开始,1≤m≤n;

则f()(1)=f()(n)=1, f(n)(m)=f(n-1)(m-1) + f(n-1)(m);

核心代码只有四步:

①新建符合的空间;

②将首尾置为1;

③遍历除首尾外的元素空间,利用公式填充;

④将填充好的列表放入结果队列里;

 1 class Solution {
 2 public:
 3     vector<vector<int> > generate(int numRows) {
 4         vector<vector<int> > rowslst;
 5         
 6         if (numRows == 0)
 7             return rowslst;
 8         
 9         for (int i=0; i<numRows; ++i) {
10             vector<int> row(i+1); 
11             row[0] = row[i] = 1;
12             
13             for(int j=1; j<i; ++j) {
14                 row[j] = rowslst[i-1][j-1] + rowslst[i-1][j];
15             }
16             
17             rowslst.push_back(row);
18         }
19         
20         return rowslst;
21     }
22 };

附录:

杨辉三角与计算机

原文地址:https://www.cnblogs.com/huxiao-tee/p/4133045.html