《剑指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相关文章推荐
- 剑指offer-面试题 9 斐波那契数列
- 剑指offer_面试题9_斐波那契数列
- 剑指Offer面试题10:斐波那契数列
- 剑指Offer学习之面试题9 : 斐波那契数列
- 《剑指offer》(面试题9):斐波那契数列
- 剑指offer——面试题9:斐波那契数列
- 剑指Offer----面试题九:斐波那契数列
- 剑指Offer面试题9(java版):斐波那契数列
- 剑指offer 面试题9 斐波那契数列
- 剑指offer-chapter2-面试题9-斐波那契数列(java)
- 剑指Offer(第二版)面试题10:斐波那契数列
- 剑指Offer系列-面试题9:斐波那契数列
- 面试题09_斐波那契数列及其变种详解——剑指offer系列
- 《剑指offer》面试题9:斐波那契数列
- 剑指Offer面试题9[斐波那契数列]
- 剑指offer面试题 斐波那契数列
- 剑指Offer_面试题09_斐波那契数列
- 《剑指offer》【面试题九:斐波那契数列】
- (剑指Offer)面试题9:斐波那契数列
- 剑指offer面试题9 斐波那契数列