斐波那契数列
题目描述
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2
输出:1
示例 2:
输入:n = 5
输出:5
提示:
0 <= n <= 100
解题思路
动态规划求解:
1. 定义状态数组,dp[i] 表示的是数字 i 的斐波那契数
//定义一个数组 arr[i] 表示第i个数字的斐波那契数列
//数组长度为n+1是因为包含了n包含了0 比如0-8斐波那契数列
2. 状态初始化
//初始化数组元素 F(0) = 0, F(1) = 1
arr[0] = 0;
arr[1] = 1;
3. 状态转移
F(N) = F(N - 1) + F(N - 2)
4. 返回最终需要的状态值
代码实现解法一
public class 斐波那契数列 {
public static void main(String[] args) {
int fib = fib(1);
System.out.println("fib = " + fib);
}
public static int fib(int n) {
//斐波那契数列公式:F(N) = F(N - 1) + F(N - 2) N>1
//初始化变量
int num0 = 0;
int num1 = 1;
int numn = 0;
for (int i = 0; i < n; i++) {
numn = (num0+num1) % 1000000007;
num0 = num1;
num1 = numn;
}
return num0;
}
}
代码实现解法二(动态规划)
public class 斐波那契数列 {
public static void main(String[] args) {
int fib = fib(8);
System.out.println("fib = " + fib);
}
public static int fib(int n) {
//动态规划四个步骤
//F(0) = 0, F(1) = 1,表示当n<=1时,返回n
if (n <= 1) return n;
//1.定义状态数组
//定义一个数组 arr[i] 表示第i个数字的斐波那契数列
//数组长度为n+1是因为包含了n包含了0 比如0-8斐波那契数列
int[] arr = new int[n+1];
//2.状态初始化
//初始化数组元素
arr[0] = 0;
arr[1] = 1;
//3.状态转移
//遍历数组
//i从2开始,是因为已知F(0) = 0, F(1) = 1
for (int i = 2; i <= n; i++) {
arr[i] = (arr[i-1]+arr[i-2]) % 1000000007;
}
//4.返回需要的状态值
return arr[n];
}
}
===>降低空间复杂度
// 状态数组空间压缩
public int fib(int n) {
if (n <= 1) return n;
// 只存储前两个状态
int prev = 0;
int curr = 1;
for (int i = 2; i <= n; i++) {
int sum = prev + curr;
prev = curr;
curr = sum;
}
return curr;
}
知识点
动态规划的四个步骤
1. 定义状态数组,dp[i] 表示的是数字 i 的斐波那契数
2. 状态初始化
3. 状态转移
4. 返回最终需要的状态值