509. 斐波那契数
// [509. 斐波那契数](https://leetcode-cn.com/problems/fibonacci-number/)
// 动态规划: 1) 确定DP数组 使用一维数组dp[i]表示第i个数字, 2) 确定递推公式 3) 确定初始状态 4) 确定遍历过程 5) 模拟结果以便于debug
// 时间复杂度O(n), 空间复杂度O(n)
class Solution {
// 完整dp解法
public int fib(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
int[] dp = new int[n + 1];
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i < n + 1; i ++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
}
// 动态规划,维护了整个状态转移过程, 但是实际上本题只需要两个状态即可
// 时间复杂度O(n), 空间复杂度O(1)
class Solution2 {
public int fib(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
int dp1 = 0;
int dp2 = 1;
for (int i = 2; i < n + 1; i ++) {
int temp = dp1;
dp1 = dp2;
dp2 = temp + dp1;
}
return dp2;
}
}
// 其他解法: 备忘录法, 利用斐波那契通项公式, 矩阵快速幂, 还有利用数组保存了30个项直接返回的 递归一行代码: return n <= 1 ? n : fib(n - 1) + fib(n - 2);
// 递归算法: 时间O(2^n), 空间O(n)