题目描述
// 力扣
// 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。
// 斐波那契数列的定义如下:
// F(0) = 0, F(1) = 1
// F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
// 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两
// 数相加而得出。
// 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008
// ,请返回 1。
题解
// 牛客
//////////////////// 暴力递归法 /////////////////////
// 递归可以,但是很暴力
public class Solution {
public int Fibonacci(int n) {
if (n == 1)
return 1;
if (n == 0)
return 0;
// 根据定义直接递归法
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
////////////////////// 动态规划 /////////////////////
public class Solution {
public int Fibonacci(int n) {
if (n <= 1) {
return n;
}
int[] f = new int[n + 1];
f[1] = 1;
// 从0,1开始,从头推到f[n]
for (int i = 2; i <= n; i++) {
f[i] = f[i - 2] + f[i - 1]; // 循环递推
}
return f[n];
}
}
public class Solution {
public int Fibonacci(int n) {
if (n <= 1) {
return n;
}
int pre1 = 0, pre2 = 1;
int f = 0;
for (int i = 2; i <= n; i++) {
f = pre2 + pre1;
pre1 = pre2;
pre2 = f;
}
return f;
}
}
// 力扣
// 力扣如果用递归方法会发现直接报时间复杂度超了
/////////////////// 动态规划 ////////////////////////
// 执行用时:0 ms , 在所有 Java 提交中击败了 100.00% 的用户
// 内存消耗: 35.2 MB, 在所有 Java 提交中击败了83.53%的用户
class Solution {
public int fib(int n) {
int a = 0, b = 1, sum;
for (int i = 0; i < n; i++) {
// 答案要求需要取模 1e9+7(1000000007),
// 如计算初始结果为:1000000008,请返回 1。
sum = (a + b) % 1000000007;
a = b;
b = sum;
}
return a;
}
}