一、题目描述
118. 杨辉三角
给定一个非负整数 numRows
,生成「杨辉三角」的前 numRows
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1 输出: [[1]]
二、题目解析
在之前只学了C语言,用二维数组创建写这道题时,需要动态开辟数组。很麻烦。
但是学了vector容器之后,使用它来秒解这道题,非常的爽!!!
首先我们需要开辟空间,vector容器开辟空间的用resize这个方法,并且开辟的时候还能直接赋值,简直不要太爽!
(注意resize和reverse的区别:Reserve操作是用于预分配Vector的容量,Reserve操作只是预分配内存,并不会改变Vector的大小;Resize操作是用于改变Vector的大小。当我们需要增加或减少Vector中的元素数量时,可以使用Resize操作。Resize会改变Vector的大小,并且如果需要的话,它会分配或释放内存。)
所以我们可以利用for循环,让第一行开辟的数据是1,第二行是2,以此来动态开辟数组!
杨辉三角最核心的一点就是:该元素的值 = 上一行同位置的元素 + 上一行同位置元素的前一个元素。
最后直接返回vector数组即可~
三、原码
class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> vv;vv.resize(numRows);for(int i = 0;i<numRows;i++){vv[i].resize(i+1,0);//给每一行开空间并且赋值vv[i].front() = vv[i].back() = 1;}for(int i = 0;i<vv.size();i++){for(int 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;}
};