我是小小強(qiáng),這是我的第4篇原創(chuàng)文章,閱讀需要大約10分鐘。
題目
LintCode:斐波納契數(shù)列
描述
查找斐波納契數(shù)列
中第 N 個(gè)數(shù)。
所謂的斐波納契數(shù)列
是指:
前2個(gè)數(shù)是 0
和1
。
第 i 個(gè)數(shù)是第i-1
個(gè)數(shù)和第i-2
個(gè)數(shù)的和。
斐波納契數(shù)列的前10個(gè)數(shù)字是:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ...
樣例
給定 1
,返回0
給定 2
,返回1
給定10
,返回 34
實(shí)現(xiàn)
遞歸實(shí)現(xiàn)
- java代碼
class Solution {
public int fibonacci(int n) {
if (n == 1) {
return 0;
} else if (n == 2) {
return 1;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
}
- 結(jié)果分析
結(jié)果:結(jié)果不盡人意,速度非常慢,甚至沒有通過 LintCode 的評(píng)測(cè)。
分析:這種遞歸不同于一般的遞歸,在 n 較大時(shí),兩次遞歸調(diào)用中存在大量的重復(fù)運(yùn)算,導(dǎo)致速度非常慢。
非遞歸實(shí)現(xiàn)
- java代碼
class Solution {
public int fibonacci(int n) {
if(1==n)
return 0;
if(2==n)
return 1;
int a=0;
int b=1;
int sum=0;
while(n>2)
{
sum=a+b;
a=b;
b=sum;
n--;
}
return sum;
}
}
- 結(jié)果分析
結(jié)果:經(jīng)測(cè)試 C++ 最快可以以 10ms 輕松通過 LintCode 的評(píng)測(cè)。
分析:時(shí)間復(fù)雜度為 o(n) ,空間復(fù)雜度為 o(1) ,效果不錯(cuò)。
細(xì)節(jié):使用 while 代替 for 節(jié)省了一個(gè) Int(4Byte) 的空間。