壹 ❀ 引

刷leetcode的第四天,原题出处为杨辉三角,题目描述如下:

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

在杨辉三角中,每个数是它左上方和右上方的数的和。

示例:

输入: 5

输出:

[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]

那么按照惯例,我们先来分析题目。

贰 ❀ 解题思路

当我看到杨辉三角时,其实我是懵逼的,大学没数学,再往前追溯学过的东西早忘了,所以要实现这段程序,肯定得先了解杨辉三角基本概念

百度一番,发现有如下结论:

  1. 每行数字的开始与结尾都是1,比如上图三角形的两边都是由1组成。
  2. 每个数字等于它上方两数的和。
  3. 第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 杨辉三角 超详细题解分析的更多相关文章

  1. leetcode 杨辉三角

    给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 5 输出: [ [1], [1,1], [1,2,1], [ ...

  2. js实现杨辉三角

    杨辉三角是计算二项式乘方展开式的系数时必不可少的工具.是由数字排列而成的三角形数表. 资料:杨辉三角第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×(n-2)/2,第四个数为 ...

  3. [LeetCode]杨辉三角 II

    题目 代码 class Solution { public: vector<int> getRow(int rowIndex) { vector<int> array(rowI ...

  4. Python实现杨辉三角,超详细!

    巧妙实现杨辉三角代码 def triangles(): N=[1] #初始化为[1],杨辉三角的每一行为一个list while True: yield N #yield 实现记录功能,没有下一个ne ...

  5. LeetCode:杨辉三角【118】

    LeetCode:杨辉三角[118] 题目描述 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 5 输出: ...

  6. [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, ...

  7. [LeetCode] Pascal's Triangle 杨辉三角

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...

  8. LeetCode 118. Pascal's Triangle (杨辉三角)

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...

  9. Pascal's Triangle leetcode java(杨辉三角)

    题目: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, ...

  10. 洛谷U14200 Changing 题解 【杨辉三角】

    题目描述 有nnn盏灯环形排列,顺时针依次标号为1⋯n1\cdots n1⋯n.初始时刻为000,初始时刻第iii盏灯的亮灭aia_iai​给定,000表示灭,111表示亮.下一时刻每盏灯的亮灭取决于 ...

随机推荐

  1. java基础-异常Exception-day10

    目录 1. 练习 2. 异常三联 try-catch-finally 3.异常的分类 3. 子类throws的异常 小于等于父类的异常 4.自定义异常 1. 练习 package com.msb01; ...

  2. java基础-java面向对象-02-day09

    目录 1. 封装 2. 继承 2.1 什么是方法的重写 2.2 super 2.3 object详解 2.4 equals方法 3. 多态 4. final修饰符 5.抽象类 6. 接口 7. 内部类 ...

  3. docker 原理之 mount namespace(下)

    1. mount namespace mount namespace 通过隔离文件系统挂载点对隔离文件系统提供支持.使用 unshare 构造 mount namespace 如下: root@chu ...

  4. SNMP 使用总结

    转载请注明出处: 1.SNMP简介 SNMP(Simple Network Management Protocol,简单网络管理协议)是一种用于网络设备和系统的管理协议.它允许网络管理员监控和管理网络 ...

  5. 问题--之前必须结合fn+f1,f2等才能调节音量,亮度,现在只按f1,f2就调节,导致快捷键冲突

    1.问题 问题如上 2.解决方式 问题原因: 热键默认打开,用fn加上esc开启了热键的默认设置 解决: 再按一次fn加上esc关闭热键的默认设置

  6. [转帖]Intel“革命性”X86s架构,带来哪些颠覆及影响?

    https://www.eet-china.com/mp/a221822.html 英特尔发布了一份新的白皮书(Intel X86-S扩展架构规格),计划简化其处理器指令集架构(ISA).英特尔提供了 ...

  7. [转帖]查看请求在nginx中消耗的时间

    需求:查看请求在nginx中消耗的时间,不包括程序响应时间. 1.声明日志的格式,在nginx配置文件nginx.conf里的http下添加如下内容: log_format test '$remote ...

  8. 【转帖】isolcpus功能与使用

    isolcpus功能存在已久,笔者追溯v2.6.11(2005年)那时内核就已经存在了isolcpus功能.根据kernel-parameters.txt 上的解释,"isolcpus功能用 ...

  9. 关于IO性能的一些学习与了解

    关于IO性能的一些学习与了解 摘要 最近心气不高. 学习进度也拖的比较慢. 以后想能够多为自己着想.自己有自己的节奏, 不能只为别人考虑. 要改变一下自己的做事风格. 一些事情想帮则帮, 不想帮就当看 ...

  10. Bash 脚本发送消息到企业微信的办法

    1. Study From https://www.cnblogs.com/elvi/p/11444388.html 2. 申请或者使用已经有的企业微信. 首先是获取一下企业id 方法如图: 3. 创 ...