LeetCode 118. 杨辉三角 | 算法-从菜鸟开始

简介: LeetCode 118. 杨辉三角 | 算法-从菜鸟开始

一、LeetCode 118. 杨辉三角


杨辉三角是啥呢?杨辉三角,是二项式系数在三角形中的一种几何排列,在杨辉三角形中,每个数是左上方和右上方的数的和。


从图示上来看下:


网络异常,图片无法展示
|


题目介绍:


给定一个非负数numRows,生成杨辉三角的前numRows行。


示例:


输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]


方案一:递归实现杨辉三角


通过观察杨辉三角的结构,我们可以看到当前层current的数据生成是依赖上一层prev数据的,遍历prev的每一元素,元素的当前项和前一项的和生成的是下一层的数据。


同时来观察下,遍历索引的开始点是0,结束点呢,是数组元素的长度prev.legnth,不是prev.length - 1。因为当前层元素的数量总是比上一层多一个.


看下代码的实现:


/**
 * @method generate
 * @description 输出杨辉三角 - 递归
 * @description:
 * @param {number} numRows 指定的前numRows行
 * @return {number[][]}
 */
function generate(numRows: number): number[][] {
  // 临界点判断,当numRows为1时直接返回结果
  if (numRows === 1) return [[1]];
  // 获取前numRow - 1行的所有有数据
  const prevs = generate(numRows - 1);
  // 获取上一行数据
  const prevLine = prevs[prevs.length - 1];
  // 遍历上一行数据,生成当前层数据
  const current: number[] = [];
  // 注意这个位置取等号,<=preve.length,因为每一个数都是左上方和右上方的数的和
  for (let i = 0; i <= prevLine.length; i++) {
    // 针对边界进行处理
    // 因为是左上方数和右上方数,会出现prevLine[-1]、prevLine[prevLine.length]的情况
    // 此时都是undefined,直接设置为0即可
    //
    // 左上方值
    const leftTop = prevLine[i - 1] ?? 0;
    // 右上方值
    const rightTop = prevLine[i] ?? 0;
    current.push(leftTop + rightTop);
  }
  return [
    // 前numRows - 1列
    ...prevs,
    // 当前列
    current,
  ];
}


在leetCode上提交代码,看看效果,还不错。


网络异常,图片无法展示
|


胡哥小课堂


??操作符是ES6中新增加的Null判断运算法,只有当运算符左侧的值位nullundefined时,才会返回右侧的值。


const obj = {
  a: null,
  b: 0
}
console.log(obj.a ?? '默认值') // 默认值
console.log(obj.b ?? '默认值') // 0
console.log(obj.b || '默认值') // 默认值


注意||??的区别


结语


本篇文章以递归的思路实现了杨辉三角的输出,在看这道题时注意分析杨辉三角每行数的特点都是:左上方的数和右上方的数的和。同时还有考虑一头一尾的特殊情况。


相关文章
|
1月前
|
存储 算法 JavaScript
怎么刷算法,leetcode上有哪些经典题目
怎么刷算法,leetcode上有哪些经典题目
16 0
|
1月前
|
算法 Java
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
23 1
|
1月前
|
算法 Java
[Java·算法·简单] LeetCode 13. 罗马数字转整数 详细解读
[Java·算法·简单] LeetCode 13. 罗马数字转整数 详细解读
23 0
|
1月前
|
算法 Java
[Java·算法·中等] LeetCode15. 三数之和
[Java·算法·中等] LeetCode15. 三数之和
30 0
|
6天前
|
算法
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
18 3
|
6天前
|
算法
代码随想录算法训练营第五十七天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
代码随想录算法训练营第五十七天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
11 3
|
6天前
|
算法
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
27 1
|
8天前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
1月前
|
算法 Java
[Java·算法·简单] LeetCode 28. 找出字符串中第一个匹配项的下标 详细解读
[Java·算法·简单] LeetCode 28. 找出字符串中第一个匹配项的下标 详细解读
22 0
|
1月前
|
算法 Java
[Java·算法·简单] LeetCode 14. 最长公共前缀 详细解读
[Java·算法·简单] LeetCode 14. 最长公共前缀 详细解读
20 0

热门文章

最新文章