面试之路(25)-斐波那契数列类问题的详解
2016-05-05 15:07
417 查看
斐波那契数列介绍:
常见的递归解法:
int Fibonacci(int n){ if(n <= 0){ return 0; } if(n == 1){ return 1; } return Fibonacci(n-1)+Fibonacci(n-2); }
递归解法的效率分析:
这棵树是调用树,有好多节点是重复的。随着n的增大,重复的节点数目急剧增大。时间复杂度随着n是指数增加的。
循环的效率更高的改进方法:
int Fibonacci(int n){ if(n <= 0){ return 0; } if(n == 1){ return 1; } int prev = 1; int next = 0; int all = 0; for(int i = 2;i <= n;++i){ all = prev + next; next = prev; prev = all; } return all; }
上述解法的时间复杂度为o(n)
时间复杂度为o(lgn)的解法:
数学先验知识:
上面的公式可以用数学归纳发求得,转化为求矩阵的乘积。
时间复杂度仍然为o(n)。
乘方的优化算法,降低到O(lgn)
斐波那契的变形问题:
变形一(青蛙跳面试题,leetcode上面有):
一只青蛙一次跳一级或者2级台阶,求青蛙条n级台阶的方法数目?
思路:
s(n) = s(n-1)+s(n-2),本质是斐波那契数列问题进一步扩展:
青蛙,一次可以条1,2到n级台阶,那么跳上n级台阶,方法数目?
思路:
f(n) = 2^(n-1);可以用数学归纳法证明
斐波那契变形二:(方块面试题)
把一个2*1的方块,放进8个2*1的方块,一共有多少种方法?
思路分析:
最后一块竖着放,还需要f(7),横着放的话,是f(6),f(8) = f(7)+f(6);
总结:
斐波那契问题灵活应用是解题关键相关文章推荐
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 有关数据库SQL递归查询在不同数据库中的实现方法
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#中的递归APS和CPS模式详解
- C#冒泡法排序算法实例分析
- WinForm实现按名称递归查找控件的方法
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#实现的算24点游戏算法实例分析
- C#中的尾递归与Continuation详解
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法