题目要求:
Given numRows, generate the first numRows of Pascal's triangle.
For example, given numRows = 5,
Return
[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]
就是用代码实现杨辉三角形。
杨辉三角形的实质是二项式(a+b)的n次方展开后各项的系数排成的三角形,它的特点是左右两边全是1,从第二行起,中间的每一个数是上一行里相邻两个数之和。
用代码实现较为简单,但是leetcode上面需要返回的是二维vector代表的数组,所以关于二维vector的细节问题需要注意。
Notice:
1) vector<vector<int>> s;这条语句只是申明了一个二维整型vector,并没有指明它的行和列的大小,所以不能用s[i][j] == A的形式进行赋值。具体的二维整型赋值方法有以下几种:
1‘ 定义的时候就赋值:vector<vector <int> > s(m ,vector<int>(n,0)); 这条语句代表:m*n的二维vector,所有元素初始化为0
2’ vector<vector<int> > s(3);这条语句代表这个容器有三行,但是列不知。可用以下方式赋值:
for(int i=0;i<3;i++)
s[i].resize(3);
resize()函数:
void resize ( size_type sz, T c = T() );
作用在于:改变长度把当前 vector容器的的长度大小重设为sz。
3‘s.push_back(vector<int>(i,1));这条语句实际上每行的大小是由i的值决定的,然后这一行的i个数全部初始化为1,相当于申请了i个内存的意思
4’此题需用第三种赋值方式进行赋值和计算,要注意的是:行和列的计数是从1 开始,但是在数组和二维vector中下标是从零开始的。
源代码如下:
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> s;//没有申明大小,不能用s[i][j]=A的形式进行赋值,
if(numRows == 0)
return s;
// s.push_back(vector<int>(i,1));表示在S的最后一行加入i列,每一列的大小均为1.
//运行结果:last executed input : 2 what's wrong???
for(int i = 1 ; i <= numRows; i++)
{
s.push_back(vector<int>(i,1));//第i行的前i列全部初始化为1,此处的i代表列的大小。
for(int j = 1; j < i-1; j++)
{
s[i-1][j] = s[i-2][j] + s[i-2][j-1];
}
}
return s;
}
};
关于杨辉三角形的第二个问题是返回给出索引Index的那列,这里的索引代表的是下表,因此的行数要少一。切记转换。
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<vector<int>> s;
//vector<int> s1;
if(rowIndex < 0)//考虑rowIndex不合法情况
return s[0];
for(int i = 1; i <= rowIndex + 1; i++)//这儿的rowindex需要加1
{
s.push_back(vector<int>(i,1));
for(int j = 1; j < i-1; j++)
{
s[i-1][j] = s[i-2][j-1] + s[i-2][j];
}
}
return s[rowIndex];
}
};