LeetCode - 070 - 爬楼梯(climbing-stairs)

栏目: IT技术 · 发布时间: 7年前

内容简介:LeetCode - 070 - 爬楼梯(climbing-stairs)

Create by jsliang on 2019-06-11 18:37:47
Recently revised in 2019-06-11 19:36:15

一 目录

不折腾的前端,和咸鱼有什么区别

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 | |  3.1 解题 - 动态规划 |

二 前言

  • 难度:简单

  • 涉及知识:动态规划

  • 题目地址:https://leetcode-cn.com/problems/climbing-stairs/

  • 题目内容

  1. 假设你正在爬楼梯。需要阶你才能到达楼顶。

  2. 每次你可以爬 1 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

  3. 注意:给定 n 是一个正整数。

  4. 示例 1

  5. 输入: 2

  6. 输出: 2

  7. 解释: 有两种方法可以爬到楼顶。

  8. 1. 1 + 1

  9. 2. 2

  10. 示例 2

  11. 输入: 3

  12. 输出: 3

  13. 解释: 有三种方法可以爬到楼顶。

  14. 1. 1 + 1 + 1

  15. 2. 1 + 2

  16. 3. 2 + 1

三 解题

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

3.1 解法 - 动态规划

  • 解题代码

  1. var climbStairs = function(n) {

  2. if (n === 1 || n === 2 || n === 3) {

  3. return n;

  4. }

  5. let memory = [0, 1, 2, 3];

  6. for (let i = 4; i <= n; i++) {

  7. memory[i] = memory[i - 1] + memory[i - 2];

  8. }

  9. return memory[n];

  10. };

  • 执行测试

  1. n: 5

  2. return

  1. 8

  • LeetCode Submit

  1. Accepted

  2. 45/45 cases passed (72 ms)

  3. Your runtime beats 95.72 % of javascript submissions

  4. Your memory usage beats 99.53 % of javascript submissions (33.2 MB)

  • 解题思路

首先,一开始看到这道题其实我是拒绝的,因为动态规划没好事!题不好做啊!(⊙﹏⊙)b

不过既然来了,那么就试试,所以在纸上画了画,还真找到了规律:

  1. n=1 的时候,有 1 种可能

  2. n=2 的时候,有 2 种可能

  3. n=3 的时候,有 3 种可能

  4. n=4 的时候,有 5 种可能

  5. n=5 的时候,有 8 种可能

  6. 以此类推,在 n 不是 1、 2 或者 3 的情况下 climbStairs(n)=climbStairs(n-1)+climbStairs(n-2)

所以答案呼之欲出:

  1. var climbStairs = function(n) {

  2. if (n === 1 || n === 2 || n === 3) {

  3. return n;

  4. }

  5. let sum = climbStairs(n - 1) + climbStairs(n - 2);

  6. return sum;

  7. };

然而,这是不可行的,LeetCode 会告诉你超时了:

  1. Time Limit Exceeded

  2. 31/45 cases passed (N/A)

  3. testcase: '45'

  4. answer:

  5. expected_answer:

  6. stdout:

然后,既然超时,那么我们的做法应该是减少时间,那么怎么减少呢?来个骚操作试试:

  1. var climbStairs = function(n) {

  2. switch (n) {

  3. case 1:

  4. return 1;

  5. case 2:

  6. return 2;

  7. case 3:

  8. return 3;

  9. case 4:

  10. return 5;

  11. case 5:

  12. return 8;

  13. case 6:

  14. return 13;

  15. case 7:

  16. return 21;

  17. case 8:

  18. return 34;

  19. case 9:

  20. return 55;

  21. case 10:

  22. return 89;

  23. }

  24. let sum = climbStairs(n - 1) + climbStairs(n - 2);

  25. return sum;

  26. };

提交试试:

  1. Accepted

  2. 45/45 cases passed (1244 ms)

  3. Your runtime beats 6.34 % of javascript submissions

  4. Your memory usage beats 37.23 % of javascript submissions (33.7 MB)

噗呲,一口血喷出,吐血身亡~

最后,再优化试试:

  1. var climbStairs = function(n) {

  2. if (n === 1 || n === 2 || n === 3) {

  3. return n;

  4. }

  5. let memory = [0, 1, 2, 3];

  6. for (let i = 4; i <= n; i++) {

  7. memory[i] = memory[i - 1] + memory[i - 2];

  8. }

  9. return memory[n];

  10. };

  1. Accepted

  2. 45/45 cases passed (72 ms)

  3. Your runtime beats 95.72 % of javascript submissions

  4. Your memory usage beats 99.53 % of javascript submissions (33.2 MB)

哟嚯,完爆敌人!

在第一种方法和第二种方法中,使用了递归。而递归,是需要时间的,递归的次数越多,耗费的时间越长,就会出现之前的超时情况。

所以,在最后,我们将递归转换成数组的遍历添加,从而做到最简优化!

不知道少年知不知道另外一种骚操作,就是将测试的 45 种情况添加过去,会得到神奇的答案喔~

就是把第二种解法的 switch...case 写 45 次…… ^_^


不折腾的前端,和咸鱼有什么区别!

LeetCode - 070 - 爬楼梯(climbing-stairs)

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

LeetCode - 070 - 爬楼梯(climbing-stairs)
jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

从零开始学微信公众号运营推广

从零开始学微信公众号运营推广

叶龙 / 清华大学出版社 / 2017-6-1 / 39.80

本书是丛书的第2本,具体内容如下。 第1章 运营者入门——选择、注册和认证 第2章 变现和赚钱——如何从0到100万 第3章 决定打开率——标题的取名和优化 第4章 决定美观度——图片的选取和优化 第5章 决定停留率——正文的编辑和优化 第6章 决定欣赏率——版式的编辑和优化 第7章 数据的分析——用户内容的精准营销 书中从微信运营入门开始,以商业变......一起来看看 《从零开始学微信公众号运营推广》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具