问题
题目:leetcode-119
思路
朴素的思路就是生成前indexNum行即可。
代码
class Solution {
public:
vector<int> getRow(int rowIndex) {
std::vector< std::vector<int> > triangle( rowIndex + 1, std::vector<int>( rowIndex + 1, int() ) );
for( int i = 0; i <= rowIndex; ++i )
{
for( int j = 0; j <= i; ++j )
{
if( !j || j == i )
triangle[i][j] = 1;
else
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
}
}
return triangle[rowIndex];
}
};
改进的办法是,考虑每次当前行的生成只是与上一行有关。所以每次迭代的时候只需保留上一行即可。
class Solution {
public:
std::vector<int> getRow(int rowIndex) {
std::vector<int> ret;
ret.push_back(1);
if( !rowIndex )
return ret;
else
{
for( int i = 1; i <= rowIndex; ++i )
{
std::vector<int> tmp = ret;
ret.clear();
for( int j = 0; j <= i; ++j )
{
if( !j || j == i )
ret.push_back(1);
else
ret.push_back( tmp[j-1] + tmp[j] );
}
}
return ret;
}
}
};
思路
滚动数组的办法。
代码
class Solution {
public:
vector<int> getRow(int rowIndex) {
int& k=rowIndex;
if(0==k){
vector<int> ret;
ret.push_back(1);
return ret;
}
else{
vector<int> ret(k+1, 0);
ret[0] = ret[1] = 1;
for(int i = 2; i <= k; ++i){
ret[0] = 1;
ret[k] = 1;
for(int j = k - 1; j > 0; --j){
ret[j] += ret[j-1];
}
}
return ret;
}
}
};