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

Posted on   AcTourist  阅读(26)  评论(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.第一种解法和第二种解法的区别

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

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

相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示