【动态规划】【打卡108天】:leetcode 509. 斐波那契数

1、题目描述

斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给你 n ,请计算 F(n) 。

2、算法分析

可以说,这是一道经典的题目,可以用递归做,但是这次我们使用DP来解。、

DP分为5个步骤:

①确定dp数组以及下标的含义。

        本题dp数组的定义为:第i个数组斐波那契的值dp[i]

②确定递归公式。

        题目已经给我们了dp[i] = dp[i-1] + dp[i-2];

③dp数组如何初始化。      

dp[0] = 0;dp[1] = 1

④确定遍历顺序。

从递归公式dp[i] = dp[i-1] + dp[i-2]中可以看出来,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的

⑤举例推导dp数组

按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导一下,当N为10的时候,dp数组应该是如下的数列:0 1 1 2 3 5 8 13 21 34 55

3、代码实现

class Solution {
    public int fib(int n) {
        if(n < 2){
            return n;
        }
        // 数组下标0...n:   n+1
        // 数组下标0...n-1: n
        int[] dp = new int[n+1];
        // 初始化数组
        dp[0] = 0;
        dp[1] = 1;
        // 遍历地推公式
        for(int index = 2;index < dp.length;index++){
            dp[index] = dp[index - 1] + dp[index - 2];
        }
        // 返回数组的值
        return dp[n];
    }
}

当然,递归也可以

class Solution {
    public int fib(int n) {
        if(n < 2){
            return n;
        }
        return fib(n-1) + fib(n-2);
    }
}

猜你喜欢

转载自blog.csdn.net/Sunshineoe/article/details/121517958