剑指 Offer 10- II. 青蛙跳台阶问题

Posted on 2022-03-10 00:28  AcTourist  阅读(35)  评论(0)    收藏  举报

一、题目

 

二、题目分析

  1.首先我们考虑最简单的情况,如果只有1级台阶,那显示只有一种跳法。如果有2级台阶,那么就两种跳法:一种是分两次跳,每次跳一级,另一种就是一次跳两级

  2.接着我们讨论最普通的情况,假设要上n层(n>2),第一种情况,第一次只跳一级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);第二种情况,第一次只跳两级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)

  3.综上所述:f(n)=f(n-1)+f(n-2)满足斐波那契数列。

三、代码

/**
 * @param {number} n
 * @return {number}
 */
var numWays = function(n) {
    if(n==0||n==1) return 1;
    let a=1,b=1,sum=0;
    for(let i=0; i<n;i++){
        sum=(a+b)%1000000007;
        a=b;
        b=sum;
    }
    return a;
};

四、其他解法

动态规划:每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到而不管之前这个状态是如何得到的 

/**
 * @param {number} n
 * @return {number}
 */
var numWays = function(n) {
    const dp = new Array();
    dp[0]=1;
    dp[1]=1;
    dp[2]=2;
    for(let i =3; i<=n;i++){
        dp[i] = (dp[i-1] + dp[i-2])%1000000007;
    }
    return dp[n];
};

1.arr=new Array() 和 arr=[]都是定义一个数组,前者是定义一个调用数组构造函数生成的数组,后者定义一个字面量定义数组的方法;两者没有太大区别。

五、理解

  1.第一种解法和第二种解法的区别

  答:第一种解法:计算一个数只会用到前面两个数的值再相加,所以不用数组保存,直接换成临时数保存;

    第二种解法:填充的顺序是由小到大填充,略过递归计算填充带来的性能消耗