10-1 斐波那契数列
题目、
写一个函数,输入 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) {
int f1 = 0, f2 = 1, ans;
for (int i = 0; i < n; i++) {
ans = (f1 + f2) % 1000000007;
f1 = f2;
f2 = ans;
}
ans = f1;
return ans;
}
}
递归:用递归可以算,但LeetCode上运行时,有一些测试用例会超时
class Solution {
public int fib(int n) {
if (n < 2) {
return n;
}
return (fib(n - 1) + fib(n - 2)) % 1000000007;
}
}
对递归进行改进: 避免重复运算。将计算过的值用map存储起来,在每次计算前查看map中是否存在。如果计算过就直接从map中取,否则就对其进行计算,并将结果存储在map中。
import java.util.HashMap;
import java.util.Map;
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
int constant = 1000000007;
public int fib(int n) {
return fib(n, new HashMap<Integer, Integer>());
}
public int fib(int n, Map<Integer, Integer> map) {
if (n < 2) {
return n;
}
if (map.containsKey(n)) {
return map.get(n);
}
int f1 = fib(n - 1, map) % constant;
map.put(n - 1, f1);
int f2 = fib(n - 2, map) % constant;
map.put(n - 2, f2);
int ans = (f1 + f2) % constant;
map.put(n, ans);
return ans;
}
}