
思路:动规五部曲。
本题需要用1个一维的dp数组来保存递归的结果。
1.确定dp数组以及下标的含义:
dp[i]的定义为:第i个数的斐波那契数值是dp[i]。
2.确定递推公式:
状态转移方程 dp[i] = dp[i - 1] + dp[i - 2]
3.dp数组如何初始化:
题目中已给,dp[0] = 0,dp[1] = 1。
4.确定遍历顺序:
从递推公式dp[i] = dp[i - 1] + dp[i - 2]中可以看出,dp[i]是依赖dp[i - 1]和dp[i - 2],那么遍历顺序一定是从前往后遍历的。
5.举例推导dp数组:
按照递推公式推导一下当n为10时,dp数组应该是如下的数列。
0 1 1 2 3 5 8 13 21 34 55
如果代码写出来发现不对,就把dp数组打印出来看看和我们推导的数列是不是一致的。
附代码:
java
class Solution {
public int fib(int n) {
if(n < 2) return n;
int a = 0,b = 1,c = 0;
for(int i = 1;i < n;i++){
c = a + b;
a = b;
b = c;
}
return c;
}
}
java
//非状态压缩的版本
class Solution {
public int fib(int n) {
if(n <= 1) return n;
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];
}
return dp[n];
}
}