壹 ❀ 引

今天是的题目来自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. 【MicroPython】用 c 添加接口 -- 添加 type

    [来源]https://www.eemaker.com/micropython-type.html

  2. Blazor SSR/WASM IDS/OIDC 单点登录授权实例5 - Winform 端授权

    目录: OpenID 与 OAuth2 基础知识 Blazor wasm Google 登录 Blazor wasm Gitee 码云登录 Blazor SSR/WASM IDS/OIDC 单点登录授 ...

  3. 【面试题精讲】说一说springboot加载配置文件优先级

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 文章更新计划 系列文章地址 Spring Boot 加载配置文 ...

  4. [转帖]nginx中的if和else语法

    https://www.dyxmq.cn/it/nginx/nginx-if.html nginx支持if语法,语法和平常的代码格式差不多:   1 2 3 if ($xxx = xxx) {     ...

  5. [转帖]终于!SOFATracer 完成了它的链路可视化之旅

    https://my.oschina.net/sofastack/blog/5283439 ▼ 背 景 有幸参与开源软件供应链点亮计划--暑期 2021 支持的开源项目,目前 SOFATracer 已 ...

  6. [转帖]Kafka 核心技术与实战学习笔记(七)kafka集群参数配置(上)

    一.Broker 端参数 Broke存储信息配置 log.dirs:非常重要,指定Broker需要使用的若干文件目录路径,没有默认值必须亲自指定. log.dir:他只能表示单个路径,补充上一个参数用 ...

  7. [转帖]CPU结构对Redis性能的影响

    文章系转载,便于分类和归纳,源文地址:https://wangkai.blog.csdn.net/article/details/111571446 CPU的多核架构和多CPU架构都会影响到Redis ...

  8. [转帖]Linux kernel内存管理之overcommit相关参数

    前言 了解 linux kernel内存管理,首先可以从用户空间的角度来看kernel的内存管理,执行ls /proc/sys/vm的命令,就可以看到vm运行的所有参数,其中就包含了跟overcomm ...

  9. ESXi6.5 登录后出现错误 必须 退出的解决办法

  10. js 闭包详解一

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于Javascript初学者应该是很有用的. 一.变量的作用域 要理解 ...