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