题目:
查找斐波纳契数列中第 N 个数。
所谓的斐波纳契数列是指:
- 前2个数是 0 和 1 。
- 第 i 个数是第 i-1 个数和第i-2 个数的和。
斐波纳契数列的前10个数字是:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ...
1、简单递归实现:
|
|
简单递归运算中,在n较大时,两次递归调用中存在大量的重复运算,导致运算速度非常慢,无法通过LinkCode
2、递归实现的优化:加入缓存
class Solution {
/*** @param n: an integer
* @return an integer f(n)
* @递归表示法,增加缓存
*/
ArrayList<Integer> buffer = new ArrayList<Integer>();//ArrayList是动态数组
public int fibonacci(int n) {
// write your code here
if(n==1) return 0;
else if(n==2) return 1;
int n1, n2, sn;
if(buffer.size()==0){
buffer.add(0);
buffer.add(1);//注意:buffer数组的角标是从0开始的,按着写的顺序依次加入
}
if(buffer.size()>n-2){
n1=buffer.get(n-3);//获取给定位置的元素,位置标号从0开始
n2=buffer.get(n-2);
}
else {
n1=fibonacci(n-2);
n2=fibonacci(n-1);
}
sn=n1+n2;
if(buffer.size()<n)
buffer.add(sn);
return sn;
}
}
3、非递归实现class Solution {
class Solution {
/**
* @param n: an integer
* @return an integer f(n)
* @非递归表示法
*/
public int fibonacci(int n) {
// write your code here
if(n == 1) return 0;
else if (n == 2) return 1;
else{
int n1 = 0;
int n2 = 1;
int sn = 0;
while (n > 2){
sn = n1 + n2;
n1 = n2;
n2 = sn;
n--;
}
return sn;
}
}
}
时间复杂度为 o(n) ,空间复杂度为
o(1)