题目描述:
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
进阶:
你可以优化你的算法到 O(k) 空间复杂度吗?
解题思路:
1,常规思路,之前求过杨辉三角,我们再求一遍,输出最后一行。
2,进阶思路,设置结果行R和结果行的上一行L,按照R[i]=L[i-1]+L[i]。
3,有公式(emmm........)。
AC代码:
1,常规:
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<vector<int>> P;
for(int i=0;i<=rowIndex;i++)
{
vector<int> row;
for(int j=0;j<=i;j++)
{
if(i==0||j==i)
row.push_back(1);
else
row.push_back(P[i-1][j-1]+P[i-1][j]);
}
P.push_back(row);
}
return P[rowIndex];
}
};
2,进阶:
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> res(rowIndex+1,1);
vector<int> lastRow(rowIndex+1,1);
for(int i=0; i<rowIndex; ++i)
{
for(int j=1;j<i+1;j++)
{
res[j]=lastRow[j-1]+lastRow[j];
}
lastRow = res;
}
return res;
}
};
3,公式:
vector<int> getRow(int rowIndex) {
vector<int> r;
r.resize(rowIndex + 1);
r[0] = r[rowIndex] = 1;
for (auto i = 1; i < (r.size() + 1) / 2; ++i)
{
r[i] = r[rowIndex - i] = (unsigned long)r[i - 1] * (unsigned long)(rowIndex - i + 1) / i;
}
return r;
}