JS leetcode 杨辉三角 超详细题解分析
壹 ❀ 引
刷leetcode的第四天,原题出处为杨辉三角,题目描述如下:
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
那么按照惯例,我们先来分析题目。
贰 ❀ 解题思路
当我看到杨辉三角时,其实我是懵逼的,大学没数学,再往前追溯学过的东西早忘了,所以要实现这段程序,肯定得先了解杨辉三角基本概念。
百度一番,发现有如下结论:

- 每行数字的开始与结尾都是1,比如上图三角形的两边都是由1组成。
- 每个数字等于它上方两数的和。
- 第n行的数字有n个,第一行有1个,第二行有2个...
当然杨辉三角的结论远不止这些,但知道的越多反而对我们程序实现的关键因素造成了干扰,我们需要知道的就上面三条就足够了。
OK。先说说我的思路,我们来将上面的结论转化成逻辑,为了方便理解,我们将杨辉三角理解成一个金字塔。
比如现在用户传入了一个数字5,我们可知金字塔一共就有五层,比较特殊的是,这个金字塔得从头部往下建;其次,在第n层会有n个数字,且这一层的左右两边都是1。
所以我们可以根据用户传入的数字来决定金字塔要建立多少层(遍历多少次):
var generate = function (numRows) {
//最终返回的数组
var result = [];
//外层遍历控制金字塔要建几层,从上往下建
for (var i = 0; i < numRows; i++) {
};
};
这里的 i 就代表当前层数,需要注意的是数组索引是从0开始,所以0其实对应的就是第一层,有那么一点点绕,还是要尝试去理解。
而在第 i 层会有 i个数字,所以我们得再嵌套一个循环,用来决定这一层的数字个数,以及数字内容(是1,还是上层数字两数的和)。
var generate = function (numRows) {
//最终返回的数组
var result = [];
//外层遍历控制金字塔要建几层,从上往下建
for (var i = 0; i < numRows; i++) {
// 内层遍历控制每层有几个元素
var arr = [];
for (var j = 0; j <= i; j++) {
};
//每次把层确定好了,就加入到最大的数组result里面去
result.push(arr);
};
return result;
};
可以看到j <= i这句代码,金字塔每层有多少个元素,其实是受层数i影响的,由于我们索引是从0开始,所以这里使用了<=。
现在问题来了,我怎么确定这一层的数字分别是啥呢?
我们可以这么去理解,首先如果当前层索引为0的数字肯定是1;其次,当前层的最后一个数字一定也是1,最后个数字怎么表示?这层元素有几个是靠 i 决定的,i为0有一个数字(arr[0]),i为1时有2个数字(arr[0],arr[1]),可以发现最后个数字其实就是索引为 i 的情况。
除去上面两种情况,其它的数字都满足等于上层上方两数字的和,当前层为 i ,上层也就是 i-1,以第三层为例不难发现,第二个数字等于上层第一个与第二个元素的和。
所以第n个元素等于上层第n-1个元素与n个元素的和,由此我们得到如下添加当前层元素的代码:
// 每层第一个与最后一个一定是1,反之,等于上次正上方两数的和
if (j === 0 || j === i) {
arr.push(1);
} else {
// 等于上一层也就是i-1层的j-1与j的合
arr.push(result[i - 1][j - 1] + result[i - 1][j])
};
由于题目要求是给定一个非负整数,所以得考虑0的情况,因此完整实现应该是这样:
/**
* @param {number} numRows
* @return {number[][]}
*/
var generate = function (numRows) {
//最终返回的数组
var result = [];
// 如果传入的是0或负数,直接返回空数组
if (numRows === 0) {
return [];
};
//外层遍历控制金字塔要建几层,从上往下建
for (var i = 0; i < numRows; i++) {
// 内层遍历控制每层有几个元素
var arr = [];
for (var j = 0; j <= i; j++) {
// 每层第一个与最后一个一定是1,反之,等于上次正上方两数的和
if (j === 0 || j === i) {
arr.push(1);
} else {
// 等于上一层也就是i-1层的j-1与j的合
arr.push(result[i - 1][j - 1] + result[i - 1][j])
};
};
//每次把层确定好了,就加入到最大的数组result里面去
result.push(arr);
};
return result;
};
当然,我在写代码之前确实有比较清晰的思路,但是在实现上部分细节没考虑好,比如我想的是当层数i>=3时才考虑元素相加的情况,所以走了不少弯路。上述代码实现参考了leetcode用户raymond-yan的实现。
另外,我在看leetcode关于数组结构卡片介绍时,提到了动态规划的概念,虽然我现在对于动态规划没有过深的理解,但是想到内层数字的length以及元素由外层数组来决定,觉得非常奇妙!!!心里总有点悟到了的感觉,哈哈哈。
那么关于杨辉三角就说到这里了!
JS leetcode 杨辉三角 超详细题解分析的更多相关文章
- leetcode 杨辉三角
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 5 输出: [ [1], [1,1], [1,2,1], [ ...
- js实现杨辉三角
杨辉三角是计算二项式乘方展开式的系数时必不可少的工具.是由数字排列而成的三角形数表. 资料:杨辉三角第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×(n-2)/2,第四个数为 ...
- [LeetCode]杨辉三角 II
题目 代码 class Solution { public: vector<int> getRow(int rowIndex) { vector<int> array(rowI ...
- Python实现杨辉三角,超详细!
巧妙实现杨辉三角代码 def triangles(): N=[1] #初始化为[1],杨辉三角的每一行为一个list while True: yield N #yield 实现记录功能,没有下一个ne ...
- LeetCode:杨辉三角【118】
LeetCode:杨辉三角[118] 题目描述 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 5 输出: ...
- [LeetCode] Pascal's Triangle II 杨辉三角之二
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...
- [LeetCode] Pascal's Triangle 杨辉三角
Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...
- LeetCode 118. Pascal's Triangle (杨辉三角)
Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...
- Pascal's Triangle leetcode java(杨辉三角)
题目: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, ...
- 洛谷U14200 Changing 题解 【杨辉三角】
题目描述 有nnn盏灯环形排列,顺时针依次标号为1⋯n1\cdots n1⋯n.初始时刻为000,初始时刻第iii盏灯的亮灭aia_iai给定,000表示灭,111表示亮.下一时刻每盏灯的亮灭取决于 ...
随机推荐
- latex · markdown | 如何写矩阵和大公式
1 \left[\begin{array}{c} a & b \\ c & d \end{array}\right] 效果: \[\left[\begin{array}{c} a &a ...
- JVM 内存模型及特点总结
本文为博主原创,未经允许不得转载: JVM 内存区域主要分为线程私有区域[程序计数器.虚拟机栈.本地方法区].线程共享区域[JAVA 堆.方法区].直接内存. 线程私有数据区域生命周期与线程相同, 依 ...
- 2023年江苏“领航杯”MISC一个很有意思的题目(别把鸡蛋放在同一个篮子里面)
别把鸡蛋放在同一个篮子里面 题目附件:https://wwzl.lanzoue.com/i6HmX16finnc 1.题目信息 解压压缩包打开附件,获得5141个txt文档,每个文档都有内容,发现是b ...
- 一 , FileChanle
package nio; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer ...
- 使用Grafana监控Nacos的简单过程
使用Grafana监控Nacos的简单过程 背景 与kafka一样,想同期监控一下nacos. 发现nacos跟minio等一样都有对应的 metrics的暴露接口. 所以这边简单使用一下. stud ...
- [转帖]Rocksdb的优劣及应用场景分析
研究Rocksdb已经有七个月的时间了,这期间阅读了它的大部分代码,对底层存储引擎进行了适配,同时也做了大量的测试.在正式研究之前由于对其在本地存储引擎这个江湖地位的膜拜,把它想象的很完美,深入摸 ...
- 【转帖】通过pip命令安装好包之后,在pycharm中不显示此库,也不能调用
目录 1. 问题描述 2. 解决方法1 3. 解决方法2 1. 问题描述 在cmd输入pip list 命令可以看到我的库都已经安装好了,但是pycharm中却没有显示. 在PyCharm查找,并没有 ...
- [转帖]ARM64体系结构编程与实践:基础知识
ARM64体系结构编程与实践:基础知识 原创 异步社区 2022-03-30 12:44:16 著作权 文章标签 寄存器 体系结构 v8 ARM64体系结构 ARM 文章分类 物联网 阅读数1570 ...
- [转帖]013 Linux 搞懂「文件所属者更改及权限的赋予」从未如此简单 (chmod、chgrp、chown)
https://my.oschina.net/u/3113381/blog/5435014 01 一图详解「ls -l」 02 两种符号区分表示文件和目录 -(横线) # 表示非目录文件 d # ...
- Python控制微信,实现聊天机器人
自从微信禁止网页版登陆之后,itchat 库实现的功能也就都不能用了,那现在 Python 还能操作微信吗?答案是:可以! 在Github上有一个项目叫<WeChatPYAPI>可以使用 ...
