#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];
    }
}
posted @ 2024-07-24 09:55  KenWan  阅读(63)  评论(0)    收藏  举报