斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
题目
- 示例 1:
输入:2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1.
- 示例2:
输入:3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2.
根据示例,已经知道题目要我们做什么了
1.基础解法
思路
- 除了N = 0; N = 1的情况特殊考虑
- 其他通过递归关系F(N) = F(N-1)+ F(N-2)
public class Solution {
public int fib(int N) {
if (N <= 1) {
return N;
}
return fib(N-1) + fib(N-2);
}
}
程序不断向下递归,而很多结果都是需要重复计算的,导致时间复杂度十分的高,当看到记忆化解法时候,发现好的算法真的很酷。
时间复杂度O(2^N)
空间复杂度O(N)
2. 记忆化自底向上的方法
- N = 0; N = 1的情况特殊考虑
- F(N) = F(N-1)+ F(N-2)基本方法没变,但是每次的结果是会存储的,不需要重复计算,时间复杂度大大降低
class Solution {
public int fib(int N) {
if (N <= 1) {
return N;
}
return memoize(N);
}
public int memoize(int N) {
int[] cache = new int[N + 1];
cache[1] = 1;
for (int i = 2; i <= N; i++) {
cache[i] = cache[i-1] + cache[i-2];
}
return cache[N];
}
}
时间复杂度:O(N)
空间复杂度:O(N)
3. 记忆化自顶向下的方法
class Solution {
private Integer[] cache = new Integer[31];
public int fib(int N) {
if (N <= 1) {
return N;
}
cache[0] = 0;
cache[1] = 1;
return memoize(N);
}
public int memoize(int N) {
if (cache[N] != null) {
return cache[N];
}
cache[N] = memoize(N-1) + memoize(N-2);
return memoize(N);
}
}
本文摘自,原文中还有更酷的解法,这里只分享了记忆化解法
作者:LeetCode
链接:https://leetcode-cn.com/problems/fibonacci-number/solution/fei-bo-na-qi-shu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。