解题过程
:::info
题目链接
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
:::
/**
* @link https://leetcode.cn/problems/pascals-triangle/
* @title 118. 杨辉三角
* @description 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
* 在「杨辉三角」中,每个数是它左上方和右上方的数的和。
* @param {number} numRows
* @return {number[][]}
*/
// 解法一:找规律法
// 思路:第一行和第二行是没有规律的,第三行开始才有,且二维数组元素数组首尾都是1,所以第三行开始,除首尾外,当前行元素(i)值为上一行元素左上角(i-1)+右上角(i)的值,即元素索引是存在对应关系的(题目核心重点关键)
var generate = function (numRows) {
const resultNums = []
for(let i = 0; i < numRows; i++) {
if (i === 0) {
// 第一行是固定的
resultNums.push([1])
} else if (i === 1) {
// 第二行也是固定
resultNums.push([1, 1])
} else {
// 第三行开始有规律
const nums = []
for (let j = 0; j <= i; j++) {
if (j === 0 || j === i) {
// 首尾为1
nums.push(1)
} else {
// 获取上一行的值
const preNums = resultNums[i - 1]
// 当前元素索引值与上一行数组元素索引值关系相加得出
const currNum = preNums[j - 1] + preNums[j]
nums.push(currNum)
}
}
resultNums.push(nums)
}
}
return resultNums
}
// 第二版优化
// var generate = function (numRows) {
// const resultNums = []
// for (let i = 0; i < numRows; i++) {
// const nums = []
// for (let j = 0; j <= i; j++) {
// if (j === 0 || j === i) {
// // 首尾为1
// nums.push(1)
// } else {
// // 获取上一行的值
// const preNums = resultNums[i - 1]
// // 当前元素索引值与上一行数组元素索引值关系相加得出
// const currNum = preNums[j - 1] + preNums[j]
// nums.push(currNum)
// }
// }
// resultNums.push(nums)
// }
// return resultNums
// }
// 第三版优化后的代码
var generate = function (numRows) {
const resultNums = []
for (let i = 0; i < numRows; i++) {
const nums = []
for (let j = 0; j <= i; j++) {
// 获取上一行的值
const preNums = i === 0 ? [] : resultNums[i - 1]
// 当前元素索引值与上一行数组元素索引值关系相加得出
const pre = j - 1 >= 0 ? preNums[j - 1] : 0
const cur = j < preNums.length ? preNums[j] : 0
const currNum = pre === 0 && cur === 0 ? 1 : pre + cur
nums.push(currNum)
}
resultNums.push(nums)
}
return resultNums
}
// const result = generate(5)
const result = generate(1)
console.log(result)
解题感受
这一题偏向数学方面计算的逻辑关系,题目看了很多遍才找到的规律,重点理解当前行元素i的值等于上一行第i位置元素值加上第i-1位置的和,代码没有去除首尾判断的简写了,没有优化到计算里面去,后续可以优化一下,找到规律就很容易,看了官方也有其他一些方法可以解答