力扣-斐波那契数

113 阅读2分钟

「这是我参与2022首次更文挑战的第33天,活动详情查看:2022首次更文挑战」。

斐波那契数

题目描述

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

F(0) = 0F(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和1开始,后面的每一想数字都是前面两项数字的和
0和1的数列并不在推导公式之内,数列是从2开始推导公式。
它们的递推关系就是每一项数字都是前两项数字的和,即从数列2开始,后面的数列都是受其前面两项数字的影响,推导出来的。
这就是如动态规划里所说的:每一个状态都是由上一个状态推导出来的。 在编程时,要将数列0和1的情况列举出来然后从数列2开始推导公式,即可得出结果。

代码描述

class Solution {
    //斐波那契数
    public int fib(int n) {
        //将数列0和1先列举出来
        if(n<=1){
            return n;
        }
        //这里定义一个数组存储数列0和1的值,方便推导公式
        int[] dp=new int[2];
        dp[0]=0;dp[1]=1;
        for(int i=2;i<=n;i++){
            //斐波那契数的核心:推导公式
            int sum=dp[0]+dp[1];
            dp[0]=dp[1];
            dp[1]=sum;
        }
        //返回最终结果
        return dp[1];
    }
}