写一个函数,输入 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。
示例 1:
输入:n = 2
输出:1
示例 2:
输入:n = 5
输出:5
提示:
0 <= n <= 100
本题用一般递归会超时,改用迭代
class Solution {
public:
int fib(int n) {
if(n == 1) return 1;
if(n == 0) return 0;
return fib(n - 1) + fib(n - 2);
}
};//超时,甚至不用N很大
class Solution {
public:
int fib(int n) {
if(n == 1) return 1;
if(n == 0) return 0;
//用迭代模拟过程,从F(1)+F(0)加起来:F(3) = F(2) + F(1),F(4) = F(3) + F(2),num1变成sum,num0变成num1
int num1 = 1, num0 = 0, sum = 0;
while(n >= 2){
sum = (num1 + num0) % 1000000007;//取余过程
num0 = num1;
num1 = sum;
n--;//算一次减一次
}
return sum;
}
};
速度快,内存小
但如果还想要递归也是可以的,fib计算过程中相同的fib重复算了很多次,可以用数组或者map储存下来
class Solution {
public:
int res[101], constant = 1000000007;
int fib(int n) {
if(n == 1) return 1;
if(n == 0) return 0;
int sum, first, second;
if(res[n - 1])
first = res[n - 1];
else first = fib(n - 1) % constant;
if(res[n - 2])
second = res[n - 2];
else second = fib(n - 2) % constant;
res[n] = (first + second) % constant;
return res[n];
}
};
速度快,内存大,容易想到
递归2:无论是加res还是fib都要进行取余
class Solution {
public:
int res[101], constant = 1000000007;
int fib(int n) {
if(n == 1) return 1;
if(n == 0) return 0;
if(res[n - 1] && res[n - 2]){
res[n] = (res[n - 1] + res[n - 2]) % constant;
return res[n];
}
else if(res[n - 1]){
res[n] = (res[n - 1] + fib(n - 2) % constant) % constant;
return res[n];
}
else if(res[n - 2]) {
res[n] = (fib(n - 1) % constant + res[n - 2]) % constant;
return res[n];
}
res[n] = (fib(n - 1) + fib(n - 2)) % constant;
return res[n];
}
};