JavaScript实现爬楼梯

来自力扣官网:https://leetcode-cn.com/problems/climbing-stairs/

1问题描述

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

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

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

2解决方法

(1)动态规划

这个问题可以被分解为一些包含最优子结构的子问题,即它的最优解可以从其子问题的最优解来有效地构建,使用动态规划来解决这一问题。

第 i阶可以由以下两种方法得到:

在第 (i−1) 阶后向上爬1阶。

在第 (i−2) 阶后向上爬2阶。

所以到达第i 阶的方法总数就是到第 (i−1) 阶和第 (i−2) 阶的方法数之和。

令dp[i]表示能到达第i 阶的方法总数:

                                                                 dp[i]=dp[i-1]+dp[i-2]

其中时间和空间复杂度都是o(n)

(2)裴波那契数法

分析问题和上面一样。可以很容易通过分析得出dp[i] 其实就是第i个斐波那契数。

                                                              Fib(n)=Fib(n-1)+Fib(n-2)

现在我们必须找出以1和2作为第一项和第二项的斐波那契数列中的第 n 个数,也就是说 Fib(1)=1且Fib(2)=2。

时间和空间复杂度分别是o(n)、o(1)

3代码(三种方法)

/**
 问题描述:
 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
 注意:给定 n 是一个正整数。
 实例:
 输入: 3
 输出: 3
 解释: 有三种方法可以爬到楼顶。
 1.  1 阶 + 1 阶 + 1 阶
 2.  1 阶 + 2 阶
 3.  2 阶 + 1 阶
 https://leetcode-cn.com/problems/climbing-stairs/
 */

function calculateClimbStairs(n) {
   //使用动态规划的方法;时间复杂度是o(n),空间也是o(n)
    //n表示楼梯数
    if(n === 1){
        return 1;
    }
    let result = []; //用数组result保存1-n个楼梯时走路的种数
    result[1] = 1;   //为了方便,数组下标从1开始保存数值,第n个表示n步有几种走法
    result[2] = 2;
    for(let i = 3; i < n; i++){
        result[i] = result[i - 1] + result[i - 2];
    }
    return result[n];
}

function climbStairs(n) {
    //使用裴波那契法(可以使用递归,但是可能超时)
    if(n === 1 || n === 2){
        return n;
    }
    let result;  //用来保存结果
    let preTwo = 1;  //需要记忆两个数
    let preOne = 2;
    for(let i = 3; i < n + 1; i++){
        result = preOne + preTwo;
        preTwo = preOne;
        preOne = result;
    }
    return result;
}

function climbStairs_2(n) {
    //递归算法(力扣里面超时啦)
    if(n === 1 || n === 2){
        return n;
    }
    return climbStairs_2(n - 1) + climbStairs_2(n - 2);
}


百里于2020年3月22日

参考:

力扣:https://leetcode-cn.com/problems/climbing-stairs/

GitHub:https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92.md#%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97

如果有错,请您指出!如有侵权,请联系我删除!

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值