一、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判断运算法,只有当运算符左侧的值位null
或undefined
时,才会返回右侧的值。
const obj = { a: null, b: 0 } console.log(obj.a ?? '默认值') // 默认值 console.log(obj.b ?? '默认值') // 0 console.log(obj.b || '默认值') // 默认值
注意
||
或??
的区别
结语
本篇文章以递归的思路实现了杨辉三角的输出,在看这道题时注意分析杨辉三角每行数的特点都是:左上方的数和右上方的数的和。同时还有考虑一头一尾的特殊情况。