斐波那契数列介绍:

常见的递归解法:
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);
总结:
斐波那契问题灵活应用是解题关键
-斐波那契数列类问题的详解&spm=1001.2101.3001.5002&articleId=100613339&d=1&t=3&u=cbc5020cfa1f4956a75a03f3c636acca)
1509

被折叠的 条评论
为什么被折叠?



