目录
题目:
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
解题思路:
实际上思路很简单,中间的每个数字,就是他的上一行同位置的数据,+上一行同位置数据-1的位置的数据。
列如第三行的’2’,他的坐标是[2][1],那么他就等于[1][1]+[1][0]处位置的数据,也就是1+1=2;
所以解题步骤如下:
第一步:创建行和列
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> vv;
vv.resize(numRows);
};
有些同学可能不了解vector<vector<int>>这句话的意思。
简单来说是这样的:我们先把括号里面的vector<int>看成一个数据,
那么就是开辟了vector<数据>这样一个数组,也就是我们下面图中的对象数组,数组中存放着一个个数据。
然后每个数据又开辟了vector<某类型的数据>,如下图的int数组。
用通俗一点的理解,就是vector(开辟行)<vector<int>(每行元素个数)>
最后再根据题目已经给的numRows,用resize函数开辟列。
备注:如果不懂得resize函数的小伙伴可以看我的这篇文章c++:reserve和resize简介和区别_幻荼的博客-CSDN博客
第二步:给首尾赋值
我们可以看到,杨辉三角的每行的第一个元素和最后一个元素都是0,所以我们这里给他赋值
for(size_t i=0;i<vv.size();i++)
{
vv[i].resize(i+1,0);//给每行开辟i个空间
vv[i][0]=1;//给首字母赋值
vv[i][vv[i].size()-1]=1;//给尾赋值,也可以写成VV[i][i]毕竟行和列相等
}
第三步:中间数
刚才已经解释了中间数如何相加,这里直接给出代码
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-1]+vv[i-1][j];
}
}
}
总代码:
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]=1;
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-1]+vv[i-1][j];
}
}
}
return vv;
}
};