119. 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行。易知杨辉三角的第k行的第i个数就是组合数C(i,k),所以转为求组合数的问题。根据公式 C(n,m)=n(n-m+1)*(n-m+2)*…*n / m!来计算。一开始分别算出分子和分母再作除法,会出现溢出的问题,换成long long还是会溢出。所以在分子相乘的过程中,只要能整除分母的元素,就除去。这样就消除了溢出的问题。


代码:
class Solution {
public:
    vector<int> getRow(int rowIndex) {
        int n = (rowIndex + 1) / 2, i, j;
        vector<int> res;
        for(i = 0; i < n; ++i)
        {
        	res.push_back(comb2(i, rowIndex));
		}
		j = i-1;
		if(rowIndex % 2 == 0)
		{
			res.push_back(comb2(i, rowIndex));
		}
		for(i = 0; i < n; ++i)
		{
			res.push_back(res[j--]);
		}
		return res;
    }
private:
	long long fact(int m, int n)
	{
		if(n == 0) return 1;
		long long res = 1;
		for(int i = m; i <= n; ++i)
		{
			res *= i;
		}
		return res;
	}
	int comb(int m, int n)
	{
		return fact(n-m+1, n) / fact(1, m);
	}
	int comb2(int m, int n)
	{
		long long res = 1;
		int k = n - m + 1, j = 2;
		for(int i = k; i <= n; ++i)
		{
			res *= i;
			while(j <= m && res % j == 0)
			{
				res /= j++;
			}
		}
		return res;
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值