题目
- 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。

- 示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] - 示例 2:
输入: numRows = 1
输出: [[1]] - 提示:
1 <= numRows <= 30
题解
vector<vector<int>> generate(int numRows) {
vector<vector<int>> triangle;
if (numRows <= 0) {
return triangle;
}
triangle.push_back(vector<int>{1});
for (int i = 1; i < numRows; ++i) {
vector<int> prevRow = triangle[i-1];
vector<int> currRow(i+1, 1);
for (int j = 1; j < i; ++j) {
currRow[j] = prevRow[j-1] + prevRow[j];
}
triangle.push_back(currRow);
}
return triangle;
}
算法原理
- 初始化:
- 创建一个二维向量 triangle 用于存储整个杨辉三角。
- 如果输入的 numRows 小于等于0,则直接返回一个空的二维向量,因为杨辉三角至少包含一行(即只有一个1的行)。
- 添加第一行:
- 向 triangle 中添加一个只包含一个元素1的向量,作为杨辉三角的第一行。
- 逐行生成:
- 使用一个外层循环,从第2行开始(索引为1,因为索引从0开始),直到 numRows 行。
- 在每次循环中,首先获取上一行(prevRow),它是 triangle 中的倒数第二个元素(因为 triangle 的最后一个元素是当前正在生成的行,还未添加到结果中)。
- 创建一个新的行向量 currRow,其长度比 prevRow 多1(因为每向下一行,元素数量就增加一个)。除了首尾元素之外,currRow 的其他元素都初始化为1。
- 使用一个内层循环,从索引1开始到 prevRow 的长度减1(即不包括 prevRow 的最后一个元素),计算 currRow 中间元素的值。这个值等于 prevRow 中对应位置的上一个元素和当前元素之和(即 prevRow[j-1] + prevRow[j])。
- 将计算好的 currRow 添加到 triangle 中,作为新的一行。
- 结束:
- 当外层循环结束时,triangle 中就包含了完整的杨辉三角的前 numRows 行。