给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
版本1
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> vec_pre;
for(int i=1;i<=rowIndex+1;++i)
{
vector<int> vec_curr;
for(int j=0;j<i;j++)
{
if(j==0||j==i-1)
vec_curr.push_back(1);
else
{
vec_curr.push_back(vec_pre[j]+vec_pre[j-1]);
}
}
vec_pre=vec_curr;
}
return vec_pre;
}
};
公式法
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> vec(rowIndex+1);
for(int i=0;i<=rowIndex/2;i++)
{
vec[i]=(sol(rowIndex,i));
vec[rowIndex-i]=vec[i];
}
return vec;
}
int sol(int n,int k)
{
long re=1;
for(int i=1;i<=k;++i)
{
re=re*(n-i+1)/i;
}
return (int)re;
}
};
公式法优化
1.只用算一半值,镜像赋值。
2.每次计算利用上一个数的值,避免重复计算,C(k,n)=C(k-1,n)*(n-k+1)/k.
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> vec(rowIndex+1);
long pre=1;
for(int i=0;i<=rowIndex/2;i++)
{
if(i==0)
vec[0]=1;
else
{
pre=pre*(rowIndex-i+1)/i;
vec[i]=(int)pre;
}
vec[rowIndex-i]=vec[i];
}
return vec;
}
};