問題:
思路:
- 在這裏我的第一想法是使用遞歸,兩行代碼提交,直接超時,無法通過,仔細一想,確實遞歸的性能並不是很好的。
- 非遞歸解法:
- 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];
}
}