首先先看题,理解什么是杨辉三角,这道题理解了题意就很好写了。 思路,首先要知道杨辉三角是什么? 我们可以看成这个样子,这样方便下标理解:
性质:杨辉三角每行开头结尾都为1,剩余元素都为上一行两个相邻元素的和。
知道了性质就好做了,我们把每一行的开头和结尾都初始化为1,其余部分按照性质来求值。
然后我们就看着图敲代码,特别好写:
code
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> vv;
vv.resize(numRows);//把vv初始化为numROWs的大小,numRows是行数,比如numnRows=5就是这个三角形有5行
//初始化每行开头和结尾
for(int i=0;i<numRows;i++)
{
vv[i].resize(i+1,0); //将数组初始化为i+1长度,并且将每一个位置都初始化为0
vv[i][0]=1; //将每行开头初始化为1
vv[i][i]=1; //每一行最后一列初始化为1
}
//按照性质来求其他元素的值
for(int i=2;i<numRows;i++)
{
for(int j=1;j<i;j++)
{
vv[i][j]=vv[i-1][j]+vv[i-1][j-1]; //其他元素值=上一行同一列和上一行同一列-1的值的和
}
}
return vv; //这个时候三角形就打印好了,返回这个三角形。
}
};
或者这个代码,道理都一样:
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++)
{
vv[i].resize(i+1,0);
vv[i][0]=vv[i][vv[i].size()-1]=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][j]=vv[i-1][j]+vv[i-1][j-1];
}
}
}
return vv;
}
};
有一点要注意:
vv[i].resize(i+1,0);
这个将数组初始化为i+1长度,并且将每一个位置都初始化为0 如果不初始化就会报访问vector指向空: