【LeetCode】119.杨辉三角 II

89 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情

题目

给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

img

示例 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;
};

结语

业精于勤,荒于嬉;行成于思,毁于随。