给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
1. 用vector实现二维数组
vector<int> getRow(int rowIndex) {
vector<vector<int>> ans(rowIndex+1);//注意行数
for(int i =0;i<rowIndex+1;i++)
ans[i].resize(i+1);
for(int i = 0; i < rowIndex+1; i++)
{
ans[i][0] = 1;
ans[i][i] = 1;
}
for(int i = 2; i < rowIndex+1; i++)
{
for(int j = 1;j < i;j++)
ans[i][j] = ans[i-1][j-1] + ans[i-1][j];
}
return ans[rowIndex];
}
2. 在一维空间中进行杨辉三角的遍历
vector<int> getRow(int rowIndex) {
vector<int> result;
for(int i = 0; i <= rowIndex; ++i){
result.push_back(1);
for(int j = i - 1; j > 0; --j){
result[j] += result[j - 1];
}
}
return result;
}
3. 利用两个一维数组,一个用于保存我们当前行的值(res),一个用于保存上一行的值(temp)
vector<int> getRow(int rowIndex) {
vector<int> res(rowIndex+1,1);
vector<int> temp(rowIndex+1,1);
for(int i = 2;i<=rowIndex;i++)
{
for(int j = 1;j<i;j++)
res[j] = temp[j-1]+temp[j];
temp = res;
}
return res;
}
4. 杨辉三角的第 k 行等价于二项式 (x + y)^k 的系数
vector<int> getRow(const int rowIndex) {
vector<int> ans;
for (int i = 0; i <= rowIndex; ++i)
ans.push_back(combination(rowIndex, i));
return ans;
}
private:
int combination(const int m, const int i) {
long long n = min(i, m - i);
long long k = m - n;
long long c = 1;
for (long long j = 1; j <= n; ++j) {
c *= (k + j);
c /= j;
}
return c;
}