杨辉三角 II
题目
给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例
输入: rowIndex = 3
输出: [1,3,3,1]
题解
方法 1 递推
依据杨辉三角的数学性质(每个数字等于上一行的左右两个数字之和),可以设置一个二维数组逐行求解杨辉三角,返回第 rowIndex 行的值。
优化 1
注意到对第 i+1 行的计算仅用到第 i 行的数据,因此可以利用滚动数组的思想优化空间复杂度。
设置两个数组 pre 和 cur,pre 保存上一行杨辉三角值,cur 保存当前行杨辉三角值,利用 cur 和 pre 的数学关系,不断更新两数组值,直至求解到第 rowIndex 行。
优化 2
只用一个数组空间来计算杨辉三角,为了避免需要用到的上一行杨辉三角值被覆盖,需要倒着计算当前行,当计算第 i 项时该值等于当前值 + 第 i-1 项值。
方法 2 公式法
依据杨辉三角的数学性质(组合数公式),可以直接计算第 rowIndex 行的元素值,公式如下:
更多题解
代码
方法 1 递推
- 杨辉三角每一行首尾元素均为1,第一个元素固定在 row[0] 位置,最后一个元素在求解每一行时设置;
- 逆向求解,避免需要用到的元素值被覆盖。
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;
}
};
方法 2 公式法
- 1LL 用法:LL 代表long long,*1LL是为了在计算时将 int 类型的变量转化为 long long,然后再赋值给 long long 类型的变量,避免有符号整型数溢出。
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> row(rowIndex + 1);
row[0] = 1;
for (int i = 1; i <= rowIndex; ++i) {
row[i] = 1LL * row[i - 1] * (rowIndex - i + 1) / i;
}
return row;
}
};