题目链接:118.杨辉三角
题目描述:
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
题目指要:
本题的主要目的是理解vector<vector<int>>,以及会访问vector<vector<int>>元素。
vector<vector<int>>实质是一个vector 里面的类型是vector<int>
template<class T>
class vector
{
private:
T* _a;
size_t _size;
size_t _capacity;
};
构造一个vv动态二维数组,vv中总共有n个元素,每个元素都是vector类型的,每行没有包含任何元素,如果n为5时如下所示:
vv中元素填充完成之后,如下图所示:
访问某行某列的元素可以直接使用方括号,例如将第二行第五列元素置为0
vv[1][4] = 0;
可以这样访问的原因实质是底层运算符重载
vector<int>
class vector
{
public:
int& operator[](size_t i)
{
//....
return _a[i];
}
private:
int* _a;
size_t _size;
size_t _capacity;
};
//vector<vector<int>>
class vector
{
public:
vector<int>& operator[](size_t i)
{
//....
return _a[i];
}
private:
vector<int>* _a;
size_t _size;
size_t _capacity;
};
问题解答:
本题比较简单,通过观察可以发现:
1️⃣每行第一列和最后一列数字为1
2️⃣除了每行第一列和最后一列,其余位置 = 上一行当前位置 + 上一行当前-1位置之和
因此我们可以初始化二维数组每个数为0,将每行第一列和最后一列数字置为1,将其余不是1的数字进行上一行当前位置 + 上一行当前-1位置相加
代码示例:
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> vv;//开一个二维顺序表(数组)vv
vv.resize(numRows);//开每行的空间
//开每列的空间
for(int i = 0 ;i < numRows ; i++){
vv[i].resize(i+1,0);//数组中每个元素置为0
vv[i][0] = vv[i][vv[i].size()-1] = 1;//让第一列和最后一列置为1
}
for(int i = 0 ;i < numRows ;i++){
for(int 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;
}
};