[C++]LeetCode: 8 Pascal's Triangle II

题目:

Given an index k, return the kth row of the Pascal's triangle.

For example, given k = 3,
Return [1,3,3,1].

Note:
Could you optimize your algorithm to use only O(k) extra space?

解法一:未优化代码

思路:构造杨辉三角,不过返回索引第K行。

Attention: 注意循环条件初始值的选取 需要代入实际情况去判断

AC Code:

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        //返回杨辉三角的第K行,索引从0开始
        //思路:构造杨辉三角,不过返回索引第K行
        //注意循环条件初始值的选取 需要代入实际情况去判断

        vector<vector<int>> Ptriangle;
        vector<int> result;
        
        if(rowIndex < 0)
            return result;
        
        result.push_back(1);
        Ptriangle.push_back(result);
        
        for(int i = 0; i < rowIndex; i++)
        {
            result.clear();
            result.push_back(1);
            
            for(int j = 0; j < i; j++)
            {
                int trint = Ptriangle[i][j] + Ptriangle[i][j+1];
                result.push_back(trint);
            }
            
            result.push_back(1);
            Ptriangle.push_back(result);
        }
        
        return Ptriangle[rowIndex];
        
    }
};


解法二:优化代码

思路:构造杨辉三角,不过返回索引第K行。

杨辉三角的每一行其实是二项式系数的序列。

二项式系数C(n,r),可以用排列组合里的数学公式直接求,但是对于计算机来讲乘法和除法速度慢,而且容易溢出。所以还是用递推公式求解,以空间换时间。

根据杨辉三角或者组合公式可以知道,递推公式为C(n,r)=C(n-1,r-1)+C(n-1,r)

对于给定的k,对应的行中有k+1个数。借助递推公式来求每个C(n,i)。

Attention: 注意循环条件初始值的选取 需要代入实际情况去判断

AC Code:

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        //优化代码
        //思路:利用二项式公示直接求某行
        
        vector<int> result;
        
        if(rowIndex < 0)
            return result;
        
        vector<int> v;
        int i, j, r;
        
        for( r = 0; r <= rowIndex; r++)
        {
            //每次都重置V
            v.clear();
            
            for( i = 0; i <= r; i++)
                v.push_back(1);
            
            //循环加入上一轮的值
            //(rowIndex-r)* r 决定了循环的次数 加几次1
            for( i = 1; i <= rowIndex-r; i++)
                for( j = 1; j <= r; j++)
                    v[j] += v[j-1];
            
            result.push_back(v[r]);
        }
        
        return result;
    }
};


解法三:更优美简洁的解法

AC Code:

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        //直接递归求解杨辉三角的某行
        
        vector<int> result;
        
        if(rowIndex < 0)
            return result;
        
        //每次外层for循环,i取不同值,对应就得到杨辉三角的第i行的值(行数从0开始),下次就可以作为递归和求和使用。
        for(int i = 0; i <= rowIndex; i++)
        {
            for(int j = i-1; j >= 1; j--)
            {
                result[j] += result[j-1];
            }
            
            result.push_back(1);
        }
        
        return result;
    }
};


Error Code:

Attention: for循环内外使用同一个循环变量r,会导致死循环。

class Solution {
public:
    vector<int> getRow(int rowIndex) {
        //优化代码
        //思路:利用二项式公示直接求某行
        
        vector<int> result;
        
        if(rowIndex < 0)
            return result;
        
        vector<int> v;
        int i, j, r;
        
        for( r = 0; r <= rowIndex; r++)
        {
            //每次都重置V
            v.clear();
            
            //for循环内外都是用r作为循环变量,会导致一个死循环!!!!
            for( r = 0; r <= rowIndex; r++)
                v.push_back(1);
            
            //循环加入上一轮的值
            //(rowIndex-r)* r 决定了循环的次数 加几次1
            for( i = 1; i <= rowIndex-r; i++)
                for( j = 1; j <= r; j++)
                    v[j] += v[j-1];
            
            result.push_back(v[r]);
        }
        
        return result;
    }
};





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值