壹 ❀ 引

今天是的题目来自leetcode的119. 杨辉三角 II,还记得几天前,我第一次遇到118. 杨辉三角,一段代码调试半天写不出来,这次遇到升级版终于开开心心快快乐乐轻松解题,题目描述如下:

给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。

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

示例:

输入: 3
输出: [1,3,3,1]

按照惯例,我先说说我的解题思路,然后再看看优质的解题方案。

贰 ❀ 解题思路

由于在JS leetcode 杨辉三角 超详细题解分析这篇文章中,我已经详细给出了杨辉三角的一些规律,这里就简笔带过。

首先这道题与之前的杨辉三角还是有点区别,之前的题目输入3,第三层为[1,2,1],而本题输入3输出的却是[1,3,3,1],说明本题可以理解成k为0时输出[1]

其次,能帮助解答本题的三个杨辉三角规律分别是:

  • 杨辉三角的第N层有N个元素,比如第一层一个,第二层2个。
  • 杨辉三角每层的第一个和最后一个元素毕竟是1
  • 杨辉三角第N层的第i个元素等于N-1层的第 i-1 个元素与N-1层的第 i 个元素的和

好了,说说我的想法,我需要2个数组,一个用于保存当前层元素的数组current,还需要一个数组previous用来存N-1层数组的元素。

比如第一层时current数组为[1],previous为[]空数组。

第二层时previous就变成了[1],current变成了[1,1]

第三层时previous变成[1,1],current变成[]1,2,1]

也就是说在进入下层时总是将current赋予previous,而previous又会成为下层元素计算的关键。

思路说了,直接贴我的实现:

/**
* @param {number} rowIndex
* @return {number[]}
*/
var getRow = function (rowIndex) {
// 建立两个数组,一个表示当层,一个表示上一层
// 用于保存上一层
var previous = [];
// 外层for决定要建到第几层,注意,这题0表示第一次,所以是i <= rowIndex而不是i < rowIndex
for (var i = 0; i <= rowIndex; i++) {
// 内层for决定这层有几个数字,i层有i个
var current = []
for (var j = 0; j <= i; j++) {
// 这两种情况表示每层的第一个元素和最后一个元素
if (j === 0 || j === i) {
current.push(1);
} else {
// 除去第一个和最后一个元素,它都应该等于上层两个数字的和
current.push(previous[j - 1] + previous[j]);
};
};
// 记录当前层,用于下一层计算
previous = current;
};
return current;
};

注释写的贼详细了,就不过多解释了。

叁 ❀ 更棒的做法

这里引用leetcode用户ClarkChainer动态规划的思路:

/**
* @param {number} rowIndex
* @return {number[]}
*/
let getRow = function (rowIndex) {
// 创建第一层数组
let resultArr = [1];
for (let i = 0; i < rowIndex; i++) {
// 每次往数组前面加个数字0
resultArr.unshift(0);
for (let j = 0; j <= i; j++) {
// 套用我们前面说的杨辉三角的规律
resultArr[j] = resultArr[j] + resultArr[j + 1];
};
};
return resultArr;
};

我看到这段代码第一感觉就是妙啊!!!!!!!!

这里一开始我们就相当于把杨辉三角的第一层创建好了,作为初始数组。前面说了,N层有N个元素,N+1层也就比N层多一个元素。而前面已知公式:

N[i] = [N-1][i-1] + [N-1][i]

而这里巧就巧在,我们在N层的前面加入了一个元素,相当于把这一层的的元素往后推了一位,此时计算公式就变成了:

N[i] = [N][i] + [N][i+1]

通过此公式来一一计算本层每个元素的值。

相比我要创建2个数组分别保存当前与上一层,这个答案好就好在只一个数组加上一个公式,模拟了我用2个数组做的事情。

那么关于本题就说到这里了。

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. LeetCode:杨辉三角【118】

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

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

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

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

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

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

  8. 以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组

    学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简 ...

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

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

  10. 杨辉三角(Pascal Triangle)的几种C语言实现及其复杂度分析

    说明 本文给出杨辉三角的几种C语言实现,并简要分析典型方法的复杂度. 本文假定读者具备二项式定理.排列组合.求和等方面的数学知识. 一  基本概念 杨辉三角,又称贾宪三角.帕斯卡三角,是二项式系数在三 ...

随机推荐

  1. 如果诸葛亮用C#写出师表...

    看到一篇18年的文章 "C++版<出师表>",站长觉得挺有意思的,就用C# 控制台也实现了一遍,技术上没啥难度,但复制代码费了1.2个小时,纯粹无聊写着玩,看者别在意枚 ...

  2. P5707 【深基2.例12】上学迟到

    1.题目介绍 2.题解 这里只有两个稍微注意的点 2.1 s % v != 0(向上取整) 这里的话,若是结果不为整数,我们必须向上取整,必须保证空余时间永远大于所需时间! 2.2 ceil向上取整函 ...

  3. RabbitMQ .net core 客户端 EasyNetQ 的使用

    依赖注入 var connectionConfiguration = new ConnectionConfiguration { Hosts = new List<HostConfigurati ...

  4. [转帖]【P1】Jmeter 准备工作

    文章目录 一.Jmeter 介绍 1.1.Jmeter 有什么样功能 1.2.Jmeter 与 LoadRunner 比较 1.3.常用性能测试工具 1.4.性能测试工具如何选型 1.5.学习 Jme ...

  5. [转帖]Springboot配置kafka用户名密码

    华为云开发者联盟 Springboot配置kafka用户名密码 Springboot配置kafka用户名密码 SpringBoot配置kafka用户名密码 Springboot配置kafka用户名密码 ...

  6. [转帖]一个轻量的Linux运维监控脚本

    https://zhuanlan.zhihu.com/p/472040635 写在前面 我的需求 嗯,有几台很老的机器,上面部署的几个很老的应用 我需要每周对机器上的一些内存,磁盘,线程,应用和数据库 ...

  7. [转帖] Strace的介绍与使用

    https://www.cnblogs.com/skandbug/p/16264609.html Strace简介 strace命令是一个集诊断.调试.统计于一体的工具,常用来跟踪进程执行时的系统调用 ...

  8. [转帖]NOHZ = ON如何影响Linux内核中的do_timer()?

    https://www.jb51.cc/faq/897483.html 如何解决NOHZ = ON如何影响Linux内核中的do_timer()?? 首先,让我们了解什么是tickless kerne ...

  9. Oracle数据库无法启动的简单处理

    1. 最近一台测试机器上面的Oracle数据库启动不起来了. 提示信息是UNDOTBS2的表空间找不到. 2. 然后可以使用 startup mount 简单开起来 但是发现还是无法使用. 3.本来想 ...

  10. 使用smem 计算Oracle用户下内存占用情况.

    1. 本来计划使用 ps 命令进行查看, 但是发现ps 最多查询出来的是 RSS的内存数据, 会多添加很多冗余的内存数据量进来, 于是作罢 2. 找了下公司的方神, 说可以使用smem 然后简单看了下 ...