LeetCode118、 杨辉三角

53 阅读2分钟

LeetCode 系列记录我学习算法的过程。

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

题目

给定一个非负整数 numRows 生成「杨辉三角」的前 numRows 行。

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

示例:

image.png

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]


输入: numRows = 1
输出: [[1]]

提示:

  • 1 <= numRows <= 30

思路

做了这么多二叉树和递归的题目,这次终于换了一种类型了😂

这个题目首先也是要找到规律,通过示例的动图,我们不难发现,每个方格的值都是他前一个数组对应下标及前一个下标的值之和

第一行初始为 1,第二行开始每行的第一项都是 1,因为上一数组只存在对应项,对应项的前一项不存在,每行的最后一项也为 1,因为上一数组只存在对应项的前一项,不存在对应项,所以要考虑到这两种情况:

  • 首先我们定义 num 用来存储结果
  • 0 开始遍历行数
  • 先定义一个数组temp用来存储本次循环的结果,因为每行第一项都为 1,所以我们先赋上初始值1,然后获取上一个数组 upRow
  • 因为temp有初始项 1,所以我们从第二项开始内层循环,每一项的值均为 上一个数组对应项的前一项 加上 上一个数组对应项的值,当为最后一项时,上一数组对应项不存在则取 0
  • 内层循环结束后将 temp 存入结果 num
  • 外层循环结束返回 num

代码实现

/**
 * @param {number} numRows
 * @return {number[][]}
 */
var generate = function(numRows) {
    // 存储结果
    let num = []
    // 遍历行
    for(let row = 0; row < numRows; row++) {
        // 初始化 1
        let temp = [1]
        // 获取上一行数组
        let upRow = num[row-1]
        // 第二项开始遍历
        for(let i = 1; i <= row; i++) {
            // 值为上一行数组 对应前一项 和 对应项 之和
            temp.push(upRow[i - 1] + (upRow[i] || 0))
        }
        // 将数组存入结果
        num.push(temp)
    }
    // 返回结果
    return num
};

image.png