您的位置:首页 > 理论基础 > 数据结构算法

118. Pascal's Triangle

2017-03-02 19:31 363 查看
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]
]


Subscribe to see which companies asked this question.

惯例翻译题目:

输入一个行数,输出帕斯卡三角;
思路:
用一个二维数组去存储这个帕斯卡三角,然后输出这个二维数组;
由于这个每一行的元素个数不一样,因此需要每一行都要resize它的元素个数;
然后如果输入是0,则直接返回vals;
输入是1和2,则直接赋值然后返回;
帕斯卡三角从第三行开始,每一行的第一个和最后一个元素是1,中间的任意一个元素vals[i][j]=vals[i-1][j-1]+vals[i-1][j];
最后输出它即可;
代码:
class Solution {
public:
    vector<vector<int>>generate(int numRows) {
        vector<vector<int>> vals;
        vals.resize(numRows);
        if(numRows==0){
            return vals;
        }
        if(numRows<3){
            if(numRows==1){
                vals[0].resize(1);
                vals[0][0]=1;
                return vals;
            }
            else{
                vals[0].resize(1);
                vals[1].resize(2);
                vals[0][0]=1;
                vals[1][0]=1;
                vals[1][1]=1;
                return vals;
            }
       
        }
        else{
            vals[0].resize(1);
            vals[0][0]=1;
            vals[1].resize(2);
            vals[1][0]=1;
            vals[1][1]=1;
            for(int i=2;i<numRows;i++){
                int j=i;
                j++;
                vals[i].resize(j);
                vals[i][0]=1;
                vals[i][i]=1;
                for(int k=1;k<i;k++){
                   vals[i][k]=vals[i-1][k-1]+vals[i-1][k];
                }
               
            }
            return vals;
        }
    }
   
};
错误一:没考虑输入的numRows是0的情况;
输入为0,则输出为[];

注释掉6~9行的情况;
//if(numRows==0){
          // return vals;
        //}
 
错误二:如果vector是作为一个二维数组用的话,那么myVector.resize(numrows)就是只定义了有多少行,或者说多少个一维数组,具体一维数组里面的元素个数还需要另外定义,比如myVector[i].resize(j);

这是注释掉第十七行的情况:                //vals[1].resize(2);
错误三:越界问题
需要注意的是resize的话是里面的元素的个数,但是数组的下标从0开始;
这是因为数组下标从0开始,杨辉三角的每行最后一个是1,因此要计算到倒数第二个,如果是第i行,那就是myVector[i-1][i-2],而不要计算到最后一个,这样就会加到一个不知道哪里来的数字;

 for(int i=2;i<numRows;i++){
                int j=i;
                j++;
                vals[i].resize(j);
                vals[i][0]=1;
                vals[i][i]=1;
                for(int k=1;k<j;k++){
                   vals[i][k]=vals[i-1][k-1]+vals[i-1][k];
                }
将k<j转成k<i就行;
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息