题目描述
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1
输出: [[1]]
提示:1 <= numRows <= 30
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> ans(numRows);
for(int i=0;i<numRows;i++)
{
ans[i].resize(i+1);
ans[i][0]=1,ans[i][i]=1;
for(int j=1;j<i;j++)
{
ans[i][j]=ans[i-1][j-1]+ans[i-1][j];
}
}
return ans;
}
};
119. 杨辉三角 II
给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。
一种简单的做法是上一题目求解结束后直接取出题目中要求的对应行,但是这种方法占用的空间大。使用滚动数组,保存要计算的当前行的上一行值,每次计算都将当前行cur赋值到pre,当做下一次循环的上一行。
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> pre, cur;
for (int i = 0; i <= rowIndex; ++i)
{
cur.resize(i + 1);
cur[0] = cur[i] = 1;
for (int j = 1; j < i; ++j)
{
cur[j] = pre[j - 1] + pre[j];
}
pre = cur;
}
return pre;
}
};
借鉴01背包的优化方式,要想计算ans[i][j]=ans[i-1][j-1]+ans[i-1][j];去掉第一个维度变为ans[[j]=ans[j-1]+ans[j];但是这个式子与原始式子是不等价的,因为等式右边使用的是上一次循环的结果,可以从大到小遍历,这样使用到的值ans[j-1]和ans[j]已经是计算好的,相当于使用了上一次计算的结果。
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> row(rowIndex + 1);
row[0] = 1;
for (int i = 1; i <= rowIndex; ++i)
{
for (int j = i; j > 0; --j)
row[j] += row[j - 1];
}
return row;
}
};