题目和示例:
代码1:(递归法)
class Solution {
public int fib(int n) {
if (n==0) return 0;
if (n==1) return 1;
return (fib(n-1) + fib(n-2))%1000000007;
}
}
代码1讲解:
分解这个递归公式便可得知。很多地方都冗余了,例如f(2)计算了3遍。上图:
代码2:(循环求余法)
class Solution {
public int fib(int n) {
int a = 0, b = 1, sum;
for(int i = 0; i < n; i++){
sum = (a + b) % 1000000007;
a = b;
b = sum;
}
return a;
}
}
代码3:(动态规划法)
class Solution {
public int fib(int n) {
if(n == 0) return 0;
int[] dp = new int[n + 1];
dp[0] = 0;
dp[1] = 1;
for(int i = 2; i <= n; i++){
dp[i] = dp[i-1] + dp[i-2];
dp[i] %= 1000000007;
}
return dp[n];
}
}
代码3解析:
动态规划法的空间开销为O(N)