题目:
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行。
Attention: 注意循环条件初始值的选取 需要代入实际情况去判断
AC Code:
class Solution {
public:
vector<int> getRow(int rowIndex) {
//返回杨辉三角的第K行,索引从0开始
//思路:构造杨辉三角,不过返回索引第K行
//注意循环条件初始值的选取 需要代入实际情况去判断
vector<vector<int>> Ptriangle;
vector<int> result;
if(rowIndex < 0)
return result;
result.push_back(1);
Ptriangle.push_back(result);
for(int i = 0; i < rowIndex; i++)
{
result.clear();
result.push_back(1);
for(int j = 0; j < i; j++)
{
int trint = Ptriangle[i][j] + Ptriangle[i][j+1];
result.push_back(trint);
}
result.push_back(1);
Ptriangle.push_back(result);
}
return Ptriangle[rowIndex];
}
};
解法二:优化代码
思路:构造杨辉三角,不过返回索引第K行。
杨辉三角的每一行其实是二项式系数的序列。
二项式系数C(n,r),可以用排列组合里的数学公式直接求,但是对于计算机来讲乘法和除法速度慢,而且容易溢出。所以还是用递推公式求解,以空间换时间。
根据杨辉三角或者组合公式可以知道,递推公式为C(n,r)=C(n-1,r-1)+C(n-1,r)。
对于给定的k,对应的行中有k+1个数。借助递推公式来求每个C(n,i)。
Attention: 注意循环条件初始值的选取 需要代入实际情况去判断
AC Code:
class Solution {
public:
vector<int> getRow(int rowIndex) {
//优化代码
//思路:利用二项式公示直接求某行
vector<int> result;
if(rowIndex < 0)
return result;
vector<int> v;
int i, j, r;
for( r = 0; r <= rowIndex; r++)
{
//每次都重置V
v.clear();
for( i = 0; i <= r; i++)
v.push_back(1);
//循环加入上一轮的值
//(rowIndex-r)* r 决定了循环的次数 加几次1
for( i = 1; i <= rowIndex-r; i++)
for( j = 1; j <= r; j++)
v[j] += v[j-1];
result.push_back(v[r]);
}
return result;
}
};
解法三:更优美简洁的解法
AC Code:
class Solution {
public:
vector<int> getRow(int rowIndex) {
//直接递归求解杨辉三角的某行
vector<int> result;
if(rowIndex < 0)
return result;
//每次外层for循环,i取不同值,对应就得到杨辉三角的第i行的值(行数从0开始),下次就可以作为递归和求和使用。
for(int i = 0; i <= rowIndex; i++)
{
for(int j = i-1; j >= 1; j--)
{
result[j] += result[j-1];
}
result.push_back(1);
}
return result;
}
};
Error Code:
Attention: for循环内外使用同一个循环变量r,会导致死循环。
class Solution {
public:
vector<int> getRow(int rowIndex) {
//优化代码
//思路:利用二项式公示直接求某行
vector<int> result;
if(rowIndex < 0)
return result;
vector<int> v;
int i, j, r;
for( r = 0; r <= rowIndex; r++)
{
//每次都重置V
v.clear();
//for循环内外都是用r作为循环变量,会导致一个死循环!!!!
for( r = 0; r <= rowIndex; r++)
v.push_back(1);
//循环加入上一轮的值
//(rowIndex-r)* r 决定了循环的次数 加几次1
for( i = 1; i <= rowIndex-r; i++)
for( j = 1; j <= r; j++)
v[j] += v[j-1];
result.push_back(v[r]);
}
return result;
}
};