LeetCode.509.斐波那契数
难度:easy
两种方法动态规划方法和递归的方法:
Java:
动态规划:
- 确定dp数组及下标位置: dp[i]的定义为:第i个数的斐波那契数值是dp[i]
- 递推公式:
dp[i] = dp[i-1] +dp [i-2]
- dp数组初始化:
dp[0] = 0; dp[1] = 1; - 遍历顺序:从前往后
- 举例推导dp数组
//非压缩状态的版本
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];
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
class Solution {
public int fib(int n) {
if (n <= 1) {
return n;
}
int a = 0;
int b = 1;
int c = 1;
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(1)
递归方法:
class Solution {
public int fib(int n) {
if (n < 2) {
return n;
}
return fib(n - 1) + fib(n - 2);
}
}
复杂度分析:
- 时间复杂度:O(2^n)
- 空间复杂度:O(n) 算上了编程语言中实现递归的系统栈所占空间
还有些比较高级的方法:通项公式法和矩阵快速幂法就不说了;



