LeetCode系列记录我学习算法的过程。
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
题目
给定一个非负整数 numRows, 生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例:
输入: 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
};