leetcode--Pascal's Triangle && ii



题目要求:

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];
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值