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 || '默认值') // 默认值


注意||??的区别


结语


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


相关文章
|
18天前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
36 0
|
5天前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
15 2
|
2月前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
57 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
2月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
47 6
|
2月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
63 2
|
2月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
46 1
|
2月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
46 1
|
2月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
72 0
|
2月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
37 0
|
2月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
50 0