题目:
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; } };