#509 斐波那契数(Java)
题目:
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
示例 1:
输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:
输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2
示例 3:
输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3
提示:
0 <= n <= 30
解题思路:
- 动态规划
步骤:
动态规划的步骤
1.定义状态:
dp[i] 表示第 i 个斐波那契数
2.状态转移方程:
根据斐波那契数列的定义,有:
dp[i] = dp[i-1] + dp[i-2]
3.初始化:
由初始条件,知道:
dp[0] = 0
dp[1] = 1
4.填表:
使用状态转移方程,从 2 到 n 依次计算每个斐波那契数
5.返回结果:
返回 dp[n],即第 n 个斐波那契数
复杂度分析:
时间复杂度:O(n),因为使用一个循环从 2 到 n,每次计算一个斐波那契数。
空间复杂度:O(n),因为使用了一个大小为 n+1 的数组来存储每个斐波那契数。
代码:
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];
}
}

浙公网安备 33010602011771号