leetcode 118.杨辉三角

72 阅读2分钟

118. 杨辉三角 - 力扣(LeetCode)

image.png

首先先看题,理解什么是杨辉三角,这道题理解了题意就很好写了。 思路,首先要知道杨辉三角是什么? 我们可以看成这个样子,这样方便下标理解:

image.png

性质:杨辉三角每行开头结尾都为1,剩余元素都为上一行两个相邻元素的和。

image.png

知道了性质就好做了,我们把每一行的开头和结尾都初始化为1,其余部分按照性质来求值。

然后我们就看着图敲代码,特别好写:

image.png

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指向空:

image.png