(1)思路
(2)解题步骤
- 定义状态:
dp[i] 表示第 i 个斐波那契数
- 状态转移方程:
根据斐波那契数列的定义,有:
dp[i] = dp[i-1] + dp[i-2]
- 初始化:
由初始条件知道:
dp[0] = 0
dp[1] = 1
- 填表:
使用状态转移方程,从 2 到 n 依次计算每个斐波那契数
- 返回结果:
返回 dp[n],即第 n 个斐波那契数
(3)复杂度
- 时间复杂度:O(n),因为使用一个循环从 2 到 n,每次计算一个斐波那契数
- 空间复杂度:O(n),因为使用了一个大小为 n+1 的数组来存储每个斐波那契数
(4)代码
class Solution {
public int fib(int n) {
// 特殊情况处理,当 n 为 0 或 1 时,直接返回 n
if(n == 0 || n ==1) {
return n;
}
// 定义 dp 数组,dp[i] 表示第 i 个斐波那契数
// 创建一个大小为 n + 1 的数组,用于存储 dp[0] 到 dp[n] 的值
int[] dp = new int[n + 1];
// 初始化状态,已知的初始值
dp[0] = 0; // F(0) = 0
dp[1] = 1; // F(1) = 1
// 填表,根据状态转移方程 dp[i] = dp[i-1] + dp[i-2] 计算 dp[2] 到 dp[n]
for(int i = 2; i < n + 1; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
// 返回第 n 个斐波那契数
return dp[n];
}
}