一、题目描述
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
n\leq 39n≤39
示例1
输入
4
返回值
3
二、代码
方法1: 简单递归
public class Solution {
public int Fibonacci(int n) {
if( n==0 )
return 0;
if( n == 2 || n == 1 )
return 1;
else
return Fibonacci(n-1) + Fibonacci(n-2);
}
}
方法2:动态规划
避免反复计算可以使用动态规划存储已经计算过的f(0-n-1)值于数组中,返回f(n)即可
空间复杂度优化
参考leetcode Krahets 精选评论:其实并不需要存储那么往前的数值。只要记住f(n-2)和f(n-1)即可,所以只要两个变量存一下这两个中间值即可。
(leetcode上还有一个大数越界的问题)
循环求余法:
大数越界: 随着 n 增大, f(n) 会超过 Int32 甚至 Int64 的取值范围,导致最终的返回值错误。
求余运算规则:
设正整数 x, y, px,y,p ,求余符号为⊙ ,则有
(x+y)⊙p=(x⊙p+y⊙p)⊙p 。
解析: 根据以上规则,可推出
f(n)⊙p=[f(n−1)⊙p+f(n−2)⊙p]⊙p
从而可以在循环过程中每次计算 sum=(a+b)⊙1000000007 ,此操作与最终返回前取余等价。
class Solution {
public int fib(int n) {
int a = 0, b = 1, sum;
for(int i = 0; i < n; i++){
sum = (a + b) % 1000000007;
a = b;
b = sum;
}
return a;
}
}