问题:
思路:
- 在这里我的第一想法是使用递归,两行代码提交,直接超时,无法通过,仔细一想,确实递归的性能并不是很好的。
- 非递归解法:
- for循环,递归的逆过程,
- 数组规律:
1 1 2 3 5 8 13 ...
下一个数字等于前面两个数字的和 - 定义一个式子: sum = a + b ; (a = 0,b=1 )
- 循环赋值:a = b, b = sum ;
- 注意取模;
- 动态规划解法:
- dp[i] = dp[i-1] + dp[i-2] ; 动态递归表达式
实现:
class Solution {
/**
* 递归方法
* 可以通过,但是超时
* @param n
* @return
*/
/*public int fib(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
return fib(n - 1) + fib(n - 2) %1000000007;
}*/
/**
* 类似动态规划
* @param n
* @return
*/
/* 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;
}*/
/**
* 动态规划
* @param n
* @return
*/
public int fib(int n) {
if (n == 0) return 0;
int dp[] = new int[n];
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}