
网站救助计划
1.为阅读体验,本站无任何广告,也无任何盈利方法,站长一直在用爱发电,现濒临倒闭,希望有能力的同学能帮忙分担服务器成本
2.捐助10元及以上同学,可添加站长微信lurenzhang888,备注捐助,网站倒闭后可联系站长领取本站pdf内容
3.若网站能存活下来,后续将会持续更新内容
题目描述
写一个函数,输入 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
(迭代) O(n)
a 存放 fib(n) 的结果,b 存放 fib(n + 1) 的结果。
时间复杂度
O(n)
空间复杂度
O(1)
C++ 代码
class Solution {
const int mod = 1e9 + 7;
public:
int fib(int n) {
if (n <= 1) return n;
int a = 0, b = 1;
while ( -- n) {
int c = (a + b) % mod;
a = b, b = c;
}
return b;
}
};
Java 代码
class Solution {
private static final int mod = 1000000007;
public int fib(int n) {
if (n <= 1) {
return n;
}
int a = 0, b = 1;
while ( -- n > 0) {
int c = (a + b) % mod;
a = b;
b = c;
}
return b;
}
}
Python 代码
class Solution:
def fib(self, n: int) -> int:
if n <= 1:
return n
a, b = 0, 1
while n > 1:
c = (a + b) % (10 ** 9 + 7)
a, b = b, c
n -= 1
return b
题解 2 (超时!!!)
(递归) O(2^n)
递归的逻辑:
n <= 1
,直接返回 n- 否则返回 fib(n – 1) + fib(n – 2)
时间复杂度
O(2^n)
空间复杂度
递归系统栈所需空间 O(n)。
C++ 代码
class Solution {
public:
const int MOD = 1000000007;
int fib(int n) {
if (n <= 1) return n;
return (fib(n - 1) + fib(n - 2)) % MOD;
}
};
Java 代码
class Solution {
private static final int MOD = 1000000007;
public int fib(int n) {
if (n <= 1) {
return n;
}
return (fib(n - 1) + fib(n - 2)) % MOD;
}
}
Python 代码
class Solution:
def fib(self, n: int) -> int:
MOD = 1000000007
if n <= 1:
return n
return (self.fib(n - 1) + self.fib(n - 2)) % MOD
本文由读者提供,Github地址:https://github.com/tonngw
点击面试手册,获取本站面试手册PDF完整版