解题过程

:::info 题目链接
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
image.png :::

  1. /**
  2. * @link https://leetcode.cn/problems/pascals-triangle/
  3. * @title 118. 杨辉三角
  4. * @description 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
  5. * 在「杨辉三角」中,每个数是它左上方和右上方的数的和。
  6. * @param {number} numRows
  7. * @return {number[][]}
  8. */
  9. // 解法一:找规律法
  10. // 思路:第一行和第二行是没有规律的,第三行开始才有,且二维数组元素数组首尾都是1,所以第三行开始,除首尾外,当前行元素(i)值为上一行元素左上角(i-1)+右上角(i)的值,即元素索引是存在对应关系的(题目核心重点关键)
  11. var generate = function (numRows) {
  12. const resultNums = []
  13. for(let i = 0; i < numRows; i++) {
  14. if (i === 0) {
  15. // 第一行是固定的
  16. resultNums.push([1])
  17. } else if (i === 1) {
  18. // 第二行也是固定
  19. resultNums.push([1, 1])
  20. } else {
  21. // 第三行开始有规律
  22. const nums = []
  23. for (let j = 0; j <= i; j++) {
  24. if (j === 0 || j === i) {
  25. // 首尾为1
  26. nums.push(1)
  27. } else {
  28. // 获取上一行的值
  29. const preNums = resultNums[i - 1]
  30. // 当前元素索引值与上一行数组元素索引值关系相加得出
  31. const currNum = preNums[j - 1] + preNums[j]
  32. nums.push(currNum)
  33. }
  34. }
  35. resultNums.push(nums)
  36. }
  37. }
  38. return resultNums
  39. }
  40. // 第二版优化
  41. // var generate = function (numRows) {
  42. // const resultNums = []
  43. // for (let i = 0; i < numRows; i++) {
  44. // const nums = []
  45. // for (let j = 0; j <= i; j++) {
  46. // if (j === 0 || j === i) {
  47. // // 首尾为1
  48. // nums.push(1)
  49. // } else {
  50. // // 获取上一行的值
  51. // const preNums = resultNums[i - 1]
  52. // // 当前元素索引值与上一行数组元素索引值关系相加得出
  53. // const currNum = preNums[j - 1] + preNums[j]
  54. // nums.push(currNum)
  55. // }
  56. // }
  57. // resultNums.push(nums)
  58. // }
  59. // return resultNums
  60. // }
  61. // 第三版优化后的代码
  62. var generate = function (numRows) {
  63. const resultNums = []
  64. for (let i = 0; i < numRows; i++) {
  65. const nums = []
  66. for (let j = 0; j <= i; j++) {
  67. // 获取上一行的值
  68. const preNums = i === 0 ? [] : resultNums[i - 1]
  69. // 当前元素索引值与上一行数组元素索引值关系相加得出
  70. const pre = j - 1 >= 0 ? preNums[j - 1] : 0
  71. const cur = j < preNums.length ? preNums[j] : 0
  72. const currNum = pre === 0 && cur === 0 ? 1 : pre + cur
  73. nums.push(currNum)
  74. }
  75. resultNums.push(nums)
  76. }
  77. return resultNums
  78. }
  79. // const result = generate(5)
  80. const result = generate(1)
  81. console.log(result)

解题感受

这一题偏向数学方面计算的逻辑关系,题目看了很多遍才找到的规律,重点理解当前行元素i的值等于上一行第i位置元素值加上第i-1位置的和,代码没有去除首尾判断的简写了,没有优化到计算里面去,后续可以优化一下,找到规律就很容易,看了官方也有其他一些方法可以解答

参考答案

错一位再逐个相加