面试题09_斐波那契数列及其变种详解——剑指offer系列
2015-07-25 10:57
381 查看
题目描述:
写一个函数,输入n,求斐波那契数列的第n项。解题思路:
这个题目很经典,但是要写好分析好与其相关的题目也不容易。后面介绍两个变形题目。思路1:递归
递归的优点就是易于理解,代码简单。
缺点就是,执行速度慢,有大量重复计算,容易造成栈溢出
思路2:迭代
迭代方方法是用空间换时间,速度比递归快。通常情况下代码要长一点。
思路3:公式法
有一个公式,可以做到O(logn)时间复杂度
采用的方法是利用矩阵相乘,分治法。
具体可参考算法导论,里面有具体讲解。
这种方法高效,但是不太实用。
代码实现:
<span style="font-size:18px;">//递归版本 long long Fibonacci(unsigned int n) { if(n<=0) return 0; if(n==1) return 1; return Fibonacci(n-1) + Fibonacci(n-2); }</span>
<span style="font-size:18px;">//迭代版本 class Solution { public: int Fibonacci(int n) { if(n==0) return 0; if(n==1) return 1; int one = 0, two = 1, ans =0; for(int i=2; i<= n; i++) { ans = one + two; one = two; two = ans; } return ans; } }; </span>
Fibonacci类型变形问题:
1、跳台阶问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析:这个也是一个Fibonacci数列问题。
到n级台阶有两种方式:从n-1级跳一步,从n-2级跳两步
所以:F(n) = F(n-1) + F(n-2)
初值:n==0 return 0;
n==1, return 1;
n==2, return 2;
迭代代码:
<span style="font-size:18px;">class Solution { public: int jumpFloor(int number) { int prev = 0; int cur = 1; for(int i=0;i<number;i++) { int temp = cur; cur = cur + prev; prev = temp; } return cur; } }; </span>
2、变态跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析:到n级台阶,有(n-1 +n-2 + n-3+ ... +1)种方式。
是一个递推式,采用归纳法可得:F(n) = 2^(n-1)
直接采用公式法: f(n) = pow(2,n-1) 一行代码解决问题。
3、矩形覆盖问题
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
分析:同样这是一个Fibonacci数列问题。
F(n) = F(n-1) + F(n-2)
代码实现:
class Solution { public: int rectCover(int number) { if(number == 0 || number == 1) return 1; if(number == 2) return 2; int one = 1, two = 2, ans = 0; for(int i=3; i<= number; i++) { ans = one + two; one = two; two = ans; } return ans; } };
相关文章推荐
- Java程序员之从菜鸟到职场高手的必看...
- 面试题08_旋转数组的最小数字——剑指offer系列
- 高效能程序员的修炼
- android面试总结01 activity生命周期
- 黑马程序员——Java基础-集合框架
- 自学android半年,已从.net转型成android程序员,分享下这个过程(转)
- 面试题07_用两个栈实现队列——剑指offer系列
- (剑指Offer)面试题31:连续子数组的最大和
- 剑指Offer面试题5(Java版):从尾到头打印链表
- 黑马程序员——Java IO总结一
- 程序员,为什么千万不要重写代码?
- 关于“构造函数”中的几个小问题,也许面试会问到哦~
- 神奇的decimal,也许面试会问到哦~
- 【黑马程序员】----java基础---反射
- 黑马程序员——Java基础-异常
- 【LeetCode-面试算法经典-Java实现】【029-Divide Two Integers(两个整数相除)】
- 【LeetCode-面试算法经典-Java实现】【028-Implement strStr() (实现strStr()函数)】
- 【LeetCode-面试算法经典-Java实现】【027-Remove Element(删除数组中指定的元素)】
- 程序员,为什么千万不要重写代码?
- Two Sigma面试专题