算法:
动态规划五部曲:
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数组
按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导一下,当N为10的时候,dp数组应该是如下的数列:
0 1 1 2 3 5 8 13 21 34 55
如果代码写出来,发现结果不对,就把dp数组打印出来看看和我们推导的数列是不是一致的。
正确代码:
class Solution {
public int fib(int n) {
//新建dp数组
int[] dp = new int[n+1];
if (n <= 1){
return n;
}
//dp数组初始化
dp[0] = 0;
dp[1] = 1;
for (int index = 2; index <= n; index++){
dp[index] = dp[index-1] + dp[index-2];
}
return dp[n];
}
}
注意:
if (n <= 1){
return n;
}
一定要写在dp[1] = 1之前;否则当n=0时,就会在dp[1]处报错
时间空间复杂度:
- 时间复杂度:O(n)
- 空间复杂度:O(n)