您的位置:首页 > 职场人生

《剑指Offer》面试题九之斐波那契数列

2017-03-15 13:55 309 查看

题目描述

编写一个函数,要求输入n,然后打印斐波那契数列的第n项。

解题思路一

因为在很多书的有关递归的的章节都会拿出这个例子来讲,所以说我们的第一印象就是使用递归来解决这个题目。

public static int getFibonacciIndexN(int n) {
if (n <= 0) {
return 0;
} else if (n == 1) {
return 1;
}
return getFibonacciIndexN(n - 1) + getFibonacciIndexN(n - 2);
}


但是由于递归计算的时间复杂度是以n的指数倍增加的,所以说这个算法的效率会非常低!

解题思路二

public static void getFibonacciIndexN(int n){
long[] a=new long[n+1];
a[0]=0;
a[1]=1;
for(int i=2;i<=n;i++){
a[i]=a[i-1]+a[i-2];
}
System.out.println(a
);
}


这种算法的时间复杂读就只有O(n)了,这也是最常用的解法!

直达OJ

http://ac.jobdu.com/problem.php?pid=1387

貌似用Java写的话不会AC,用C++写的话就可以!

题目变形

一只青蛙一次可以跳上一个台阶,也可以跳上两个台阶。求该青蛙跳上一> 个n级的台阶总共有多少中跳法。

解题思路

首先我们明确,当这只青蛙已经跳到第n(n>=3)个台阶,那么这只青蛙是从哪个台阶跳上来的呢?

第一种是从第 n-1 个台阶跳上来。(跳一个台阶)

第二种是从第 n-2 个台阶跳上来。(跳两个台阶)

设f(n)为跳上第n个台阶的跳发总数。

那么是不是有: f(n)=f(n-1)+f(n-2)

所以大家有没有发现,其实这就是一个斐波那契数列的变形,原理是一模一样的!

题目再变形

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求> 该青蛙跳上一个n级的台阶总共有多少种跳法。

解题思路

这个题目是九度oj上面的:http://ac.jobdu.com/problem.php?pid=1389

题目叫着:变态青蛙跳台阶

哈哈,在有了上面的知识后,我们就可以得到如下的一个递推式子:

f(n)=f(n-1) + f(n-2) + …… + f(2) + f(1) + f(0)

注意这个f(0)的取值,从原点可以跳到任意的位置,所以这也是一种跳发,故 f(0) =1。

写出如下的算法:

public static void getFibonacciIndexN(int n) {
long[] a = new long[n + 1];
a[0]
e72e
= 1;
a[1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = i - 1; j >= 0; j--) {
a[i] += a[j];
}
}
System.out.println(a
);
}


注意:这个题目经过数学归纳法证明后有如下的结论:f(n)=2(n−1)

然后我就去oj上面测试了下,用了C++里面的pow函数,结果能AC,但是耗时时间较长!

类似题目

类似题目在九度OJ上面还有这个:http://ac.jobdu.com/problem.php?pid=1390
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: