力扣原题
首先我们要做的第一件事就是去选择正确的求解模型
我可以试着来分析一下如何使用C语言来进行求解,首先我们来看到的是这个 返回值
int**
int**
呢,原因就在于对于我们这个杨辉三角来说,虽然呈现的是一个三角形的样子,但是呢其底层的实现其实还是一个二维数组,所以在函数内部我们肯定要去开辟出一个二维数组,读者可以通过下面这张图再来回顾一下有关二级指针的知识点(忘记了可以去看看指针相关文章)returnSize
,其代表的是整个二维矩阵的行数,而returnColumnSizes
代表的则是每一行的列数。int*
,另一个则是二级指针int**
呢?如果你有看过 二叉树练习题之二叉树的遍历 的话就可以知道它们都叫做输出型参数所以就这么来看,我们若是使用C语言来求解本题的话,就会变得很麻烦
class Solution {
public:
vector<vector<int>> generate(int numRows) {
}
};
vector>
来进行表示接下去我们就来分析一下这道题的思路
vector
的二维矩阵vector<vector<int>> vv;
vector
中所学习的【resize】接口,既改变了size
,又改变了capacity
vv.resize(numRows);
0
,接下去呢再固定地将每一行的第一个元素vv[i][0]
和最后一个元素vv[i][i]
都设置为1
for(size_t i = 0;i < vv.size(); ++i)
{
// 首先将二维数组中的所有元素初始化为0
vv[i].resize(i + 1, 0);
// 然后将每一行的第一个和最后一个元素初始化为1
vv[i][0] = vv[i][i] = 1;
}
for(size_t i = 0;i < vv.size(); ++i)
{
for(size_t j = 0;j < vv[i].size(); ++j)
{
if(vv[i][j] == 0)
{
// 右上方:vv[i - 1][j]
// 左上方:vv[i - 1][j - 1]
vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];
}
}
}
对于当前的这个值就等于其上方的那一个数和上方左侧的那一个数之和
vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];
整体代码展示:
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> vv;
vv.resize(numRows);
for(size_t i = 0;i < vv.size(); ++i)
{
// 首先将二维数组中的所有元素初始化为0
vv[i].resize(i + 1, 0);
// 然后将每一行的第一个和最后一个元素初始化为1
vv[i][0] = vv[i][i] = 1;
}
for(size_t i = 0;i < vv.size(); ++i)
{
for(size_t j = 0;j < vv[i].size(); ++j)
{
if(vv[i][j] == 0)
{
// 右上方:vv[i - 1][j]
// 左上方:vv[i - 1][j - 1]
vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];
}
}
}
return vv;
}
};
运行结果: