剑指 Offer 10-2(动态问题篇2).青蛙跳台阶问题
问题描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
解题思路:
第0级:一种方式,就是原地不动;
第1级:1种方式,即从0走一步到第1级;
第2级:2种方式,即从0到1到2,或者直接从0到2;
第3级:考虑每次只能上1或者2级,那么到第三级只有两种情况:从第1级上两步到第3级,或者从第2级走一步到第三级。上面我们又计算了,到第1级只有一种方式,到第二级有2种方式,所以到第三级的方式就有:11+21=3。每一次从前一级或者前二级到当前级都只有一种方式,所以也可以写成:1+2=3。
… …
第n级:同上,到第n级只有两种方式:从n-2级走两步到第n级,或者从n-1级走一步到第n级。假设到第n-2级的方式有 f(n-2)种,到第n-1级的方式有f(n-1)种,则到第n级的方式有:f(n-2)*1+f(n-1)*1=f(n-2)+f(n-1)。
从上面分析可以看出,其实除了f(0)=1这个假设前提不同,后面的逻辑和斐波那契数列是一致的。
示例:
输入:n = 2 输出:2
输入:n = 7 输出:21
输入:n = 0 输出:1
代码实现
class Solution {
public int numWays(int n) {
if(n < 0){
throw new RuntimeException("请输入正确的整数!");
}
if(n < 2){
return 1;
}
//由解题思路对于f(n-2)和f(n-1)需要判断在n>=2时的情况
int[] array = new int[n + 1];
array[0] = 1;
array[1] = 1;
//i < n + 1表示i最大为n
for(int i = 2;i < n + 1;i++){
array[i] = (array[i - 1] + array[i - 2]) % 1000000007;
}
return array[n];
}
}