[LeetCode]PASCAL Triangle系列

今天的练习题是triangle三件套:Triangle, PASCAL Triangle, PASCAL Triangle II. 

PASCAL Triangle就是小学奥数中的“杨辉三角”, 存在如下关系

triangle[i+1][j+1] = triangle[i][j]+triangle[i][j+1]

即第i+1行第j+1个元素为第i行第j个元素与第j+1个元素之和

PASCAL Triangle的题目要求:输出PASCAL Triangle的前numRows行

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]
]

根据生成规则,一个vector指向当前行,一个vector指向上一行,注意边界位置的下标不要越界

 1 class Solution {
 2 public:
 3     vector<vector<int> > generate(int numRows) {
 4         // IMPORTANT: Please reset any member data you declared, as
 5         // the same Solution instance will be reused for each test case.
 6         
 7         vector<vector<int>> triangle;
 8         if(numRows<1)
 9             return triangle;
10         
11         vector<int> prev(1, 1); // [1]
12         vector<int> cur;
13         triangle.push_back(prev);
14         
15         for(int i=1; i<numRows; ++i)
16         {
17             for(int j=0; j<i+1; ++j)
18             {
19                 int left = j>0?prev[j-1]:0; //注意下标为0的位置
20                 int right = j<i?prev[j]:0; //注意下标为i的位置
21                 cur.push_back(left+right);
22             }
23             triangle.push_back(cur);
24             prev = cur;
25             cur.clear();
26         }
27         
28         return triangle;
29     }
30 };
View Code

----------------------------------------------------

PASCAL Triangle II

与上一题类似,输出第rowIndex行PASCAL Triangle. 

N行的三角形,注意rowIndex的取值范围为[0, N-1]

原题

Given an index k, return the kth row of the Pascal's triangle.

For example, given k = 3,
Return [1,3,3,1].

代码

 1 class Solution {
 2 public:
 3     vector<int> getRow(int rowIndex) {
 4         // IMPORTANT: Please reset any member data you declared, as
 5         // the same Solution instance will be reused for each test case.
 6         vector<int> prev(1, 1);
 7         
 8         if(rowIndex<1)
 9             return prev;
10         
11         vector<int> row;
12         for(int i=1; i<rowIndex+1; ++i)
13         {
14             for(int j=0; j<i+1; ++j)
15             {
16                 int left = j>0?prev[j-1]:0;
17                 int right = j<i?prev[j]:0;
18                 row.push_back(left+right);
19             }
20             prev = row;
21             row.clear();
22         }
23         
24         return prev;
25     }
26 };
View Code
原文地址:https://www.cnblogs.com/practice/p/3394458.html