118.杨辉三角
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1
输出: [[1]]
vector<vector<int>> generate(int numRows) {
vector<vector<int>> ret(numRows);
for (int i = 0; i < numRows; ++i) {
ret[i].resize(i + 1);
ret[i][0] = ret[i][i] = 1;
for (int j = 1; j < i; ++j) {
ret[i][j] = ret[i - 1][j] + ret[i - 1][j - 1];
}
}
return ret;
}
这是一个解决"Pascal’s Triangle"问题的C++实现。函数"generate"接受一个整数"numRows"作为输入,并返回一个向量的向量,表示Pascal三角形的前numRows行。
实现的方法是首先创建一个向量的向量"ret",其中包含numRows行。对于每一行"i"(从0开始),向量"ret[i]“被调整为"i + 1"个元素,并且第一个和最后一个元素设置为1(因为它们在Pascal’s Triangle中总是1)。然后通过将上一行"i-1"的相应元素的和相加来填充其余元素。具体而言,对于行"i"中的每个元素"j”(不包括第一个和最后一个元素),该值被设置为上一行"i-1"中索引为"j"和"j-1"的元素之和。
最后,函数返回已完成的"ret"向量的向量,表示Pascal三角形的前numRows行。
numRows=5的示例输出为:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
代码的详细解释:
vector<vector<int>> generate(int numRows)
:这是一个函数声明,它接受一个整数参数numRows,并返回一个向量的向量。这个函数名叫做"generate"。vector<vector<int>> ret(numRows)
:这里定义了一个名为"ret"的向量的向量,其包含numRows个向量,每个向量的长度分别为1, 2, 3, …, numRows。for (int i = 0; i < numRows; ++i)
:这是一个循环语句,它从0开始遍历到numRows-1,每次迭代都会处理一个新的行。ret[i].resize(i + 1)
:这会将ret[i]的大小调整为i+1个元素,这个值表示第i行中元素的个数。ret[i][0] = ret[i][i] = 1
:这里设置了第i行的第一个和最后一个元素的值为1,因为Pascal三角形中每行的第一个和最后一个元素都是1。for (int j = 1; j < i; ++j)
:这是另一个循环语句,它从第2个元素开始,遍历到i-1个元素。因为第一个和最后一个元素已经在上一步中设置了,所以这里不需要再次处理。ret[i][j] = ret[i - 1][j] + ret[i - 1][j - 1]
:这一行代码计算了第i行第j个元素的值。具体而言,它是由上一行(i-1)的第j个元素和第j-1个元素相加得到的。return ret
:这行代码返回了最终的结果,即Pascal三角形的前numRows行。