题目
Pascal's Triangle
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] ]
解析
很简单,下一行第j元素用上一行相同的位置和前一个位置的和即可。需要注意的就是两边都是1
直接上代码
class Solution {
public:
vector<vector<int>> generate(int numRows){
vector<vector<int>> ret;
for (int i = 0;i<numRows;i++)
{
vector<int> tmp(i+1);
tmp[0] = 1;
tmp[i] = 1;
for (int j = 1;j<i;j++)
{
tmp[j] = ret[i-1][j]+ret[i-1][j-1];
}
ret.push_back(tmp);
}
return ret;
}
};
方法挺简单的,可以优化的地方在于其实他是左右对称的,没必要把一行全计算一遍。
看看大神的代码
从左到右
class Solution {
public:
vector<vector<int>> generate(int numRows){
vector<vector<int> > result;
if(numRows == 0) return result;
result.push_back(vector<int>(1,1)); //first row
for(int i = 2; i <= numRows; ++i)
{
vector<int> current(i,1); // 本行
const vector<int> &prev = result[i-2]; // 上一行
for(int j = 1; j < i - 1; ++j)
{
current[j] = prev[j-1] + prev[j]; // 左上角和右上角之和
}
result.push_back(current);
}
return result;
}
};
从右到左
class Solution {
public:
vector<vector<int>> generate(int numRows){
vector<vector<int> > result;
vector<int> array;
for (int i = 1; i <= numRows; i++)
{
for (int j = i - 2; j > 0; j--)
{
array[j] = array[j - 1] + array[j];
}
array.push_back(1);
result.push_back(array);
}
return result;
}
};