青蛙跳台

此博客链接:https://www.cnblogs.com/ping2yingshi/p/13539509.html

青蛙跳台

题目链接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入:n = 2
输出:2
示例 2:

输入:n = 7
输出:21
示例 3:

输入:n = 0
输出:1

 

题解:

         说明:一个问题的解,可以把问题拆分为小的步骤求解,并且大问题依赖于小步骤的解,那么这类问题可以用递归处理。

         思路:此题青蛙跳台问题,每次青蛙跳下一个台阶时,可以把青蛙下一次跳台阶的前一个跳台阶的次数求解出来,这分为两种情况:

                  情况一:还有大于等于2个台阶可以跳,那此时青蛙跳台阶有两种跳法,1青蛙直接一次跳两个台阶。2.青蛙一次跳一个台阶,跳两次。

                  情况二:最后只有一个台阶,那么青蛙只能跳一个台阶,,只有一种跳法。

    计算公式:  最后只有一个台阶:f(n)=f(n-1);这里青蛙只有一种跳法,跳法数还是等于前一次得跳法数。(1)

              最后有两个台阶:  f(n)=f(n-2)+2;这里青蛙可以选择一个一个跳,也可以选择一下子跳两个台阶。(2)

以上我是正向想法,从倒数第二次台阶数来考虑青蛙可以有多少种跳法,这里会有一个问题,就是,上面公式(2)会包含公式一的跳法,即青蛙最后有两个台阶跳时,可以一个一个跳,当跳完第一个台阶时,后面再跳最后一个台阶时,这和只剩一个台阶数公式一重复了,所以逆向考虑最好。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

       我们考虑,当青蛙已经跳完最后一个台阶,成功到达楼上时,此时青蛙可能时从前面以恶搞台阶跳上来的,也可能时从前面两个台阶跳上来的,那青蛙最后一次的跳法可以有前面f(n-1)种跳法加上前面f(n-2)种跳法。

递归条件是f(n)=f(n-1)+f(n-2)。

递归出口:f(0)=1;f(1)=1;

一开始直接用的递归,但是超时了

 

 把递归赶紧改成了循环。

代码

class Solution {
    public int numWays(int n) {
        if(n==0)
        return 1;
        if(n==1)  
        return 1;
        int a=1;
        int b=1;
        int sum=2;
        for(int i=2;i<=n;i++)
     {
         sum=(a+b)%1000000007;
         a=b;
         b=sum;
     }
 
   return sum;
    }
}

 

        

        

     

posted @ 2020-08-21 10:03  萍2樱释  阅读(314)  评论(2编辑  收藏  举报