解题过程
:::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) {// 首尾为1nums.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] : 0const cur = j < preNums.length ? preNums[j] : 0const currNum = pre === 0 && cur === 0 ? 1 : pre + curnums.push(currNum)}resultNums.push(nums)}return resultNums}// const result = generate(5)const result = generate(1)console.log(result)
解题感受
这一题偏向数学方面计算的逻辑关系,题目看了很多遍才找到的规律,重点理解当前行元素i的值等于上一行第i位置元素值加上第i-1位置的和,代码没有去除首尾判断的简写了,没有优化到计算里面去,后续可以优化一下,找到规律就很容易,看了官方也有其他一些方法可以解答
