您的位置:首页 > 其它

119. Pascal's Triangle II

2017-09-14 11:27 344 查看
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  math