摘要

​剑指 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)的值。

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

记忆化递归法:

  • 原理: 在递归法的基础上,新建一个长度为 nn 的数组,用于在递归时存储 f(0)至 f(n)的数字值,重复遇到某数字则直接从数组取用,避免了重复的递归计算。
  • 缺点: 记忆化存储需要使用 O(N)的额外空间。

剑指 Offer 10- II. 青蛙跳台阶问题_数组_02

1.2 复杂度分析

  • 时间复杂度:O(n)。
  • 空间复杂度:O(1)。

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;
}

博文参考