[网易2012年某笔试题] 求斐波那契数列, 要求时间复杂度尽可能小(简单题,不熟悉斐波那契的同学可参考)
2014-08-19 00:28
316 查看
递归法:
最容易想到的一种方法,简单易行,但缺点太明显。#include<stdio.h> int fib(int n) { if (n == 1 || n == 2) return 1; return fib(n-1) + fib(n-2); } int main() { printf("%d\n", fib(10)); getchar(); return 0; }暂不论使用了多少栈空间,算法本身就是指数级的复杂度了。
迭代法:
也是很容易想到的一个方法,开一个数组,依次求解。#include<stdio.h> #define maxn 30 int fib[maxn]; int main() { fib[1] = fib[2] = 1; for(int i = 3; i < maxn; i++) fib[i] = fib[i-1] + fib[i-2]; printf("%d\n", fib[10]); getchar(); return 0; }时间复杂度是O(n), 空间复杂度是O(n).
滚动数组:
既然fib[i]只跟fib[i-1], fib[i-2]有关,从fib[i-3]开始就没用了。那么这些空间完全可以利用起来。#include<stdio.h> int fib[3]; int main() { fib[0] = fib[1] = 1; for(int i = 2; i < 10; i++) fib[i%3] = fib[(i-1)%3] + fib[(i-2)%3]; printf("%d\n", fib[(10-1)%3]); getchar(); return 0; }时间复杂度是O(n), 空间复杂度是O(1)
公式法:
斐波那契本身有通项公式-_-|||,所以一个公式就搞定了,唯一缺点是double的精度有限,有时可能不够精确#include<stdio.h> #include<math.h> int fib(int n) { double sq = sqrt(5.0); return int((pow(1+sq, n) - pow(1-sq, n)) / (pow(2.0, n) * sq)); } int main() { printf("%d\n", fib(10)); getchar(); return 0; }
相关文章推荐
- AVL树(考研的同学需要注意其定义)的判定(某公司2012年校园招聘笔试题目)
- 求两个字符串公共子序列的最大长度(参考阿里巴巴2015研发笔试)(简单)
- 只有自己才能对自己负责,别人的建议只能做参考。简单的才是最美的,不要以为将程序搞得复杂就好,其实简单的简洁的只要符合功能要求才是最完美的。
- 将数组中的元素去重,并保持数组元素原顺序输出 要求时间复杂度尽可能的小
- 斐波那契数列的两种实现方式(递归(大于O(n方))和迭代(O(n))----网易笔试2013录
- java实现斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39
- AVL树(考研的同学需要注意其定义)的判定(某公司2012年校园招聘笔试题目)
- 斐波那契数列的两种实现方式(递归(大于O(n方))和迭代(O(n))----网易笔试2013录
- 网易的一道笔试题的参考解法---关于广告牌投放问题
- [摘自CSDN人才频道]网易互动对Web开发人员的要求 不局限于Web开发技术
- IBM在印度的笔试题(供大家参考)(3)
- 网易 天下2 的简单评论
- IBM在印度的笔试题(供大家参考)(8)
- 我一个同学朋友关于消息头的定义,非常具有参考价值
- HR之声:技术笔试为何难过人文关 解剖网易笔试题
- 2005年9月全国计算机等级考试二级C笔试试卷(含参考答案)
- IBM在印度的笔试题(供大家参考)1
- IBM在印度的笔试题(供大家参考)(5)
- IBM在印度的笔试题(供大家参考)(7)
- 最简单的Struts程序(4)---Struts应用的国际化(参考孙卫琴的struts一书)