【剑指Offer】个人学习笔记_10 I. 斐波那契数列
目录
刷题日期:19:3110 星期四2021年3月18日
个人刷题记录,代码收集,来源皆为leetcode
经过多方讨论和请教,现在打算往Java方向发力
主要答题语言为Java
题目1:
-
剑指 Offer 10- I. 斐波那契数列
难度简单116
写一个函数,输入
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
初始解答:
斐波那契数列即0,1,1,2,3,5,8,13,21,34。
记得之前隐约看过相关的东西,这题可以用递归也可以用循环来解,先尝试一下。
最直观的解法。
class Solution {
public int fib(int n) {
// 最直观的解法
if(n == 0) return 0;
if(n == 1) return 1;
return fib(n-1) + fib(n-2);
}
}
在第44项的时候就已经超出序列要求了,很多计算是重复的。
用递归方法计算的时间复杂度是以n的指数的方式递增的。
根据书里的提示,把中间的项保存起来,如果计算过就直接用。从下往上的解法可以实现时间复杂度为O(n)的算法:
class Solution {
public int fib(int n) {
// 从下往上的解法
if(n == 0) return 0;
if(n == 1) return 1;
int fib1 = 1, fib2 = 0, fib = 0;
for(int i = 2;i<=n;+