剑指 Offer 10- II. 青蛙跳台阶问题
原创
©著作权归作者所有:来自51CTO博客作者我是庄小焱的原创作品,请联系作者获取转载授权,否则将追究法律责任
摘要
剑指 Offer 10- II. 青蛙跳台阶问题
剑指 Offer 10- I. 斐波那契数列
一、Dp解析
1.1 DP分析
递归法:
- 原理: 把 f(n) 问题的计算拆分成 f(n−1)和 f(n−2) 两个子问题的计算,并递归,以 f(0) 和 f(1) 为终止条件。
- 缺点: 大量重复的递归计算,例如 f(n) 和 f(n−1) 两者向下递归需要 各自计算 f(n−2)的值。
记忆化递归法:
- 原理: 在递归法的基础上,新建一个长度为 nn 的数组,用于在递归时存储 f(0)至 f(n)的数字值,重复遇到某数字则直接从数组取用,避免了重复的递归计算。
- 缺点: 记忆化存储需要使用 O(N)的额外空间。
1.2 复杂度分析
1.3 code示例
/**
* @description 采用的地推的思想 但是这样是的超过内存限制
* @param: n
* @date: 2022/12/21 11:24
* @return: int
* @author: xjl
*/
public int fib(int n) {
if (n<2){
return n;
}
return fib(n-2)+fib(n-1);
}
public int fib2(int n) {
final int MOD = 1000000007;
if (n < 2) {
return n;
}
int a = 0, b = 0, c = 1;
for (int i = 2; i <= n; ++i) {
a = b;
b = c;
c = (a + b) % MOD;
}
return c;
}
public int numWays3(int n) {
if (n<2){
return 1;
}
int a=0;
int b=1;
int c=1;
for (int i=2;i<=n;i++){
a=b;
b=c;
c=(a + b) % 1000000007;
}
return c;
}
博文参考