解题过程
:::info
题目链接
给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和
:::
/*** @link https://leetcode.cn/problems/pascals-triangle-ii/* @title 119. 杨辉三角 II* @description 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。* 在「杨辉三角」中,每个数是它左上方和右上方的数的和* @param {number} rowIndex* @return {number[]}*/// 解法一:// 思路:最简单的思路就是根据做过的118题的代码改一下,最终数组返回最后一个元素就可以了,注意之前参数是行数,现在是索引行,也就是相对之前遍历一维数组时临界值要+1// var getRow = function (rowIndex) {// const resultNums = []// for (let i = 0; i <= rowIndex; 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.pop()// }// 解法二:// 思路:递归方式,可以通过计算当前值为计算上一行的值推算出来进行累加,其实就是通过改上面的代码从for循环遍历改为递归// 缺点:像斐波那契数列,数值越大计算时间越久,官方测试用例rowIndex=24的时候就已经超出最大时间限制了// 所以该方法虽然可行,但并不是最优解,还可以再优化// 输入值24已经超出时间限制了// var getRow = function (rowIndex) {// const nums = []// const calc = (row, index) => {// console.log('row', row, index)// if (row === 0) {// return index < 0 || index > 0 ? 0 : 1// } else {// return calc(row - 1, index - 1) + calc(row - 1, index)// }// }// for (let i = 0; i <= rowIndex; i++) {// const j = calc(rowIndex, i)// console.log('j', j)// nums.push(j)// }// return nums// }// 优化递归版// 输入值11已经超出时间限制了// var getRow = function (rowIndex) {// const calc = (row, index) => {// const nums = []// // 当前行开头为1// nums.push(1)// if (row === 0) { return nums }// if (row > 1) {// for (let i = 1; i <= row - 1; i++) {// const j = calc(row - 1)[i - 1] + calc(row - 1)[i]// nums.push(j)// }// }// // 当前行结尾为1// nums.push(1)// return nums// }// return calc(rowIndex)// }// 解法三:// 思路:网上看到很不错的解题方案,其实就是我上面想破天也没想到的递归数组版var getRow = function (rowIndex) {const res = []for(let i = 1; i <= rowIndex + 1; i++) {// 当前行数的数组元素初始值都为1res[i - 1] = 1// 重置数组首尾之外元素位置的值for (let j = i - 2; j > 0; j--) {// 这一步理解起来确实有一定的难度,但也很巧妙利用当前值与上一轮计算的值关系res[j] = res[j - 1] + res[j]}}return res}const result = getRow(3)// const result = getRow(0)// const result = getRow(1)// const result = getRow(10)// const result = getRow(20)console.log(result)
解题感受
跟昨天做的118题一样的题目,只不过换了返回值,直接根据昨天的改就很简单做出来,尝试了其他解法,首先想到了递归,但是递归写的两版跟斐波那契数列一样,导致传参数值大的时候执行时间很长,不算好,理解思路即可,第三种解法是参考别人题解的,感觉还不错的解题思路,就是我一直在想的数组递归法,但是时间有限下没想出来,挺不错的解题思路,简单
