「这是我参与2022首次更文挑战的第33天,活动详情查看:2022首次更文挑战」。
斐波那契数
题目描述
斐波那契数,通常用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和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];
}
}