Given numRows, generate the first numRows of Pascal's triangle.
For example, given numRows = 5,
Return
[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]
分析:
定义子问题:result[i][j]为三角形i,j位置的值
1,初始化边界:
for(int i=0;i<numRows;i++)//第一列 全为1
result[i][0]=1;
for(int i=0;i<numRows;i++)//三角形对角线 全为1
result[i][i]=1;
2,在初始化基础上的递推过程
比较显然从第二行往下递推:很容易看出result[i][j]=result[i-1][j]+result[i-1][j-1];
最后发现申请二维数组时以下两种方式完全等价。
vector< vector<int> > result(numRows);
//申请数组
for(int i=0;i<numRows;i++)
result[i].resize(i+1);
或者这种:
vector< vector<int> > result;
vector<int> tmpres;
//申请数组
for(int i=0;i<numRows;i++)
{
tmpres.resize(i+1);
result.push_back(tmpres);
}
可AC代码为:
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector< vector<int> > result;
vector<int> tmpres;
//申请数组
for(int i=0;i<numRows;i++)
{
tmpres.resize(i+1);
result.push_back(tmpres);
}
//初始化边界
for(int i=0;i<numRows;i++)//第一列
result[i][0]=1;
for(int i=0;i<numRows;i++)//对角线
result[i][i]=1;
//递推,由上一行和上一行右一列的元素和
for(int i=2;i<numRows;i++)
for(int j=1;j<i;j++)
result[i][j]=result[i-1][j]+result[i-1][j-1];
return result;
}
};
或者:
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector< vector<int> > result(numRows);
if(numRows==0)
return result;
//申请数组
for(int i=0;i<numRows;i++)
result[i].resize(i+1);
//初始化边界
for(int i=0;i<numRows;i++)//第一列
result[i][0]=1;
for(int i=0;i<numRows;i++)//对角线
result[i][i]=1;
//递推,由上一行和上一行右一列的元素和
for(int i=2;i<numRows;i++)
for(int j=1;j<i;j++)
result[i][j]=result[i-1][j]+result[i-1][j-1];
return result;
}
};
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?
分析:
和上面一体道理一样,只是只返回指定的一行即可!总感觉可以直接推出来,无无需申请这么多空间!
class Solution {
public:
vector<int> getRow(int rowIndex) {
int numRows=rowIndex+1;
vector< vector<int> > result(numRows);
//申请数组
for(int i=0;i<numRows;i++)
result[i].resize(i+1);
//初始化边界
for(int i=0;i<numRows;i++)//第一列
result[i][0]=1;
for(int i=0;i<numRows;i++)//对角线
result[i][i]=1;
//递推,由上一行和上一行右一列的元素和
for(int i=2;i<numRows;i++)
for(int j=1;j<i;j++)
result[i][j]=result[i-1][j]+result[i-1][j-1];
return result[rowIndex]; //返回指定行
}
};
学习别人的算法:
只用O(k)的空间
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> result;
for (int i = 0; i <= rowIndex; i++)//计算第k行(从0算起)
{
for (int j = i - 1; j > 0; j--)//每次遍历计算k行的值
result[j] = result[j - 1] + result[j];
result.push_back(1);
}
return result;
}
};
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.youkuaiyun.com/ebowtang/article/details/50688017
原作者博客:http://blog.youkuaiyun.com/ebowtang