青蛙跳台
此博客链接: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; } }