杨辉三角1
思路:其实这道题把这些数好好摆放以下,就很容易看出它的规律;a[i][j]=a[i-1][j-1]+a[i-1][j];
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> generate(int numRows)
{
vector<vector<int>> res;
if (numRows == 0)
return res;
vector<int> temp;
//把第一行放进去
temp.push_back(1);
res.push_back(temp);
if (numRows == 1)
return res;
//从第二行开始依次生成
int r = 2;
while (r <= numRows)
{
vector<int> temp(r);
temp[0] = 1;
for (int k = 1; k < r - 1; k++)
{
temp[k] = res[r - 2][k - 1] + res[r - 2][k];
}
temp[r - 1] = 1;
res.push_back(temp);
r++;
}
return res;
}
int main()
{
vector<vector<int>> test = generate(5);
for (auto s : test)
{
for (auto ss : s)
{
cout << ss << ' ';
}
cout << endl;
}
return 0;
}
杨辉三角2
思路1:普通的方法就是参照杨辉三角1的解法稍微改动下,返回对应下标的动态数组即可;注意这里最上面一行是第0行
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<vector<int>> res;
vector<int> temp;
//把第一行放进去
temp.push_back(1);
res.push_back(temp);
if (rowIndex == 0)
return res[0];
//从第二行开始依次生成
int r = 1;
while (r <= rowIndex)
{
vector<int> temp(r+1);
temp[0] = 1;
for (int k = 1; k < r; k++)
{
temp[k] = res[r - 1][k - 1] + res[r - 1][k];
}
temp[r] = 1;
res.push_back(temp);
r++;
}
return res[rowIndex];
}
};
思路2:由于每一行都只与上一行有关,所以只用一个动态数组就行,对于新的一行,只需对上一行从尾到头的邻近两个元素相加即可得到;
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> result;
for(int i = 0; i <= rowIndex; ++i){
result.push_back(1);
for(int j = i - 1; j > 0; --j){
result[j] += result[j - 1];
}
}
return result;
}
};