携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
题目
给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1
输入: rowIndex = 3
输出: [1,3,3,1]
示例 2
输入: rowIndex = 0
输出: [1]
示例 3
输入: rowIndex = 1
输出: [1,1]
提示
0 <= rowIndex <= 33
题解
思路
第一种思路就是直接把这么多层杨辉三角全部生成出来,再直接返回。
但是题目要求了空间复杂度。所以,思路如下。
已知,杨辉三角每层末尾都是数字1,相当于数组中每次向最后push1。所以我们对空数组循环 rowIndex + 1 次,每次 push(1) 就可以达到第 rowIndex 层的长度。
但是每次添加完1之后,我们需要将中间的数加起来。
由于,每层首位都是1,所以我们有两种方式,从前往后和从后往前。
我们这里采用从后往前相加(为什么?)
对于杨辉三角中的数 res[i][j] = res[i - 1][j] + res[i - 1][j - 1];
当我们从后往前相加时(只包含当前层时)公式应该为res[j] = res[j] + res[j - 1]
改变的是当前的 res[j],不会改变之前的res[0]...res[j - 1]。
但是如果我们从前往后相加,公式同样为res[j] = res[j] + res[j - 1]
当我们计算 res[j + 1] = res[j + 1] + res[j] 时,res[j] 已经是最新层次的数了,而我们需要的是上一层次的数,此时就需要加入一个新的临时变量来保存该值。
代码
var getRow = function(rowIndex) {
const res = [];
for(let i = 0;i < rowIndex + 1;i++) {
res.push(1);
let start = 1;
for(let j = 1;j < i;j++) {
let temp = res[j];
res[j] += start;
start = temp;
}
}
return res;
};
结语
业精于勤,荒于嬉;行成于思,毁于随。