剑指offer——面试题9:求斐波那切数列的四种方法

另一个相关的链接:https://blog.csdn.net/Allenlzcoder/article/details/80297333
总结下求斐波那切数列的4中方法

Solution1:递归法

代码复杂度为O(2n)O(2n)O(2^n),简单却不是一个好思路呀~

class Solution {
public:int Fibonacci(int n) {if(n==1 || n==2) return 1;return Fibonacci(n-1)+Fibonacci(n-2);}
};

Solution2:迭代法

时间复杂度O(n)O(n)O(n)参考清华大学邓俊辉老师的数据结构中的算法写成。真的是其妙极了~

class Solution {
public:int Fibonacci(int n) {int f=0,g=1;//fib(0)=0,fib(1)=1if(n==0)return f;else if(n==1 || n==2)return g;while(1<n--){g=g+f;f=g-f;}return g;}
};

复杂度为O(n)O(n)O(n)!!!

Solution3:矩阵法

时间复杂度O(logn)O(logn)O(logn)
参考博客网址:https://blog.csdn.net/kuhuaishuxia/article/details/52217872
主要思路:


现在我们主要要知道如何求:。我们可以采用分治法,具体来讲是二分法来解决这个问题:

这样我们可以写出代码如下:

//定义2×2矩阵;
struct Matrix2by2
{  //数据成员  int m00;  int m01;  int m10;  int m11;  //构造函数  Matrix2by2(int m_00,int m_01,int m_10,int  m_11)  {  m00 = m_00;  m01 = m_01;  m10 = m_10;  m11 = m_11;  }  };  //定义2×2矩阵的乘法运算
Matrix2by2 MatrixMultiply(const Matrix2by2& matrix1,const Matrix2by2& matrix2)
{  Matrix2by2 matrix12(1,1,1,0);  matrix12.m00 = matrix1.m00 * matrix2.m00 + matrix1.m01 * matrix2.m10;  matrix12.m01 = matrix1.m00 * matrix2.m01 + matrix1.m01 * matrix2.m11;  matrix12.m10 = matrix1.m10 * matrix2.m00 + matrix1.m11 * matrix2.m10;  matrix12.m11 = matrix1.m10 * matrix2.m01 + matrix1.m11 * matrix2.m11;  return matrix12;  }  //定义2×2矩阵的幂运算
Matrix2by2 MatrixPower(unsigned int n)
{  Matrix2by2 matrix(1,1,1,0);  if (n == 1)  {  matrix = Matrix2by2(1,1,1,0);  }  else if (n % 2 == 0)  {  matrix = MatrixPower(n / 2);  matrix = MatrixMultiply(matrix, matrix);  }  else if (n % 2 == 1)  {  matrix = MatrixPower((n-1) / 2);  matrix = MatrixMultiply(matrix, matrix);  matrix = MatrixMultiply(matrix, Matrix2by2(1,1,1,0));  }  return matrix;
}
//计算Fibnacci的第n项
int fib(unsigned int n)
{  if (n == 0)  return 0;  if (n == 1)  return 1;  Matrix2by2 fibMatrix = MatrixPower(n-1);  return fibMatrix.m00;  }  

Solution4:公式法

时间复杂度O(1)O(1)O(1)
斐波那切数列的通项公式:

class Solution {
public:int Fib(int n) {const double s = sqrt(5);return (pow((1+s)/2, n) - pow((1-s)/2, n))/s;}
}

剑指offer——面试题9:求斐波那切数列的四种方法相关推荐

  1. 剑指offer | 面试题10:斐波那切数列

    转载本文章请标明作者和出处 本文出自<Darwin的程序空间> 本文题目和部分解题思路来源自<剑指offer>第二版 开始行动,你已经成功一半了,献给正在奋斗的我们 题目 求斐 ...

  2. 剑指offer——面试题10:斐波那契数列

    个人答案: 1 #include"iostream" 2 #include"stdio.h" 3 #include"string.h" 4 ...

  3. [剑指offer]面试题9:斐波那契数列

    面试题9:斐波那契数列 题目一:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: ❖ 效率很低的解法,挑剔的面试官不会喜欢 代码如下: long long f ...

  4. 《剑指offer》c++版本 10. 斐波那契数列

    如题: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). 这道题基本上学过算法的人都直到,斐波那契数列即,即1,1,2,3,5....... 用数 ...

  5. 牛客网(剑指offer) 第七题 斐波那契数列

    //问题描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 function Fibonacci($n){//显然递归超时了 2333333333 ...

  6. C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)

    众所周知,斐波那契数列是非常经典的一个数列,它的数学公式如下 为了便于观察,我们列出它的几项:0  1  1  2  3  5  8  13  21...... 下面我们将介绍四种方法来用C语言计算机 ...

  7. 剑指Offer #07 斐波那契数列(四种解法)| 图文详解

    题目来源:牛客网-剑指Offer专题 题目地址:斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 题目解析 ...

  8. 辛星Java动态规划教程第一篇:求斐波那切数列

    对于理解动态规划来说,最简单的题目还是求斐波那切数列的第i个值.很多资料都把它作为一个印子,以此来介绍动态规划的基本定义. 不过也有些书认为菲波那切数列过于简单,以致于不能让读者感受到动态规划的优美之 ...

  9. Python中斐波那契数列的四种写法

    在这些时候,我可以附和着笑,项目经理是决不责备的.而且项目经理见了孔乙己,也每每这样问他,引人发笑.孔乙己自己知道不能和他们谈天,便只好向新人说话.有一回对我说道,"你学过数据结构吗?&qu ...

最新文章

  1. 前来推荐一本比较喜欢的读物——《浪潮之巅》
  2. 基于注解的 IOC 配置——创建对象(Component、Controller、Service、Repository)注入数据(Autowired、Qualifier、Resource、Value)
  3. MySQL协议包说明
  4. python pyqt5 窗体自适应_Pyqt5自适应布局实例
  5. 一阶暂态电路三要素法和三种响应
  6. gitter 卸载_最佳Gitter渠道:开发人员工具
  7. 云服务器如何链接本地打印机_利用FileZilla搭建云服务器FTP服务端和本地客户端...
  8. 修复版ZFAKA发卡系统源码 自适应PC+手机端
  9. 部署SCVMM2012 SP1 集群(1)---部署AD
  10. javaEE(3)_servlet基础
  11. 类和对象编程(一):类成员函数
  12. android 权限问题吗,Android 6.0前后权限问题
  13. echart添加点击跳转链接事件多次跳转的问题
  14. php++仿网页版微信,【原创】html5高仿微信网页版|h5仿微信聊天实战
  15. 用Java解决牛客网题目JD1年终奖
  16. VSS的口令破解算法的思路
  17. html边框如何制作三角形,如何用css3绘制有边框的三角形
  18. python股票预测_利用Keras长短期记忆(LSTM)模型预测股票价格
  19. 【转】OrCAD 16.3安装和破解方法
  20. Excel(WPS)使用VBA,不打开文件情况下提取其他工作簿数据

热门文章

  1. 【原】c#对xml的操作
  2. java 远程连接_java实现连接远程服务器并执行命令的基本原理
  3. 服务器查看数据库日志文件,服务器数据库查看日志文件
  4. 服务器脱机状态,从脱机工作切换到联机工作
  5. 擦地机器人毕业设计_救援机器人毕业设计
  6. python新手图解_Python完全新手教程
  7. java horizontalbarchart_Android-MPChart,HorizontalBarChart 水平柱状图颜色渐变
  8. 1977年发生事件_大金蛇:千年银蛇,万年金蛇:1977年【蛇蛇人】11月上旬家里有“爆炸性”事件发生!...
  9. android回收内存保存变量,android基础之onSaveInstanceState用法(一)保存容易被回收的自定义类的静态全局变量...
  10. maven配置testng_TestNG Maven Surefire插件配置