题目描述
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
题目分析
- 解题核心:**如果能够知道一行杨辉三角,我们就可以根据每对相邻的值轻松地计算出它的下一行。**它的求解方式在两种语言的代码中也是一样的;
- 所以Java也好,C++也好,都是为了达成这个结果而努力;
- Java的官方题解中,一行是一个List,然后都放在一个大的List中;C++解法中,这个List变成了vector而已;
- 这两个解法,让我想起那个电视剧《都挺好》。这个词形容这两个解法再合适不过了哈哈。
代码
Java解法
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> triangle = new ArrayList<List<Integer>>();
if (numRows == 0) return triangle;
triangle.add(new ArrayList<>());
triangle.get(0).add(1);
for (int rowNum = 1; rowNum < numRows; rowNum++)
{
List<Integer> row = new ArrayList<>();
List<Integer> prevRow = triangle.get(rowNum - 1);
row.add(1);
for (int j = 1; j < rowNum; j++)
{
row.add(prevRow.get(j - 1) + prevRow.get(j));
}
row.add(1);
triangle.add(row);
}
return triangle;
}
}
C++解法
From: LeetCode用户YouLookDeliciousC
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> triangle(numRows);
if (numRows == 0) return triangle;
for (int i = 0; i < numRows; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) triangle[i].push_back(1);
else triangle[i].push_back(triangle[i - 1][j - 1] + triangle[i - 1][j]);
}
}
return triangle;
}
};