博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer——面试题9:求斐波那切数列的四种方法
阅读量:2254 次
发布时间:2019-05-09

本文共 2239 字,大约阅读时间需要 7 分钟。

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

另一个相关的链接:

总结下求斐波那切数列的4中方法

Solution1:递归法

代码复杂度为 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 ) 参考清华大学邓俊辉老师的数据结构中的算法写成。真的是其妙极了~

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

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

Solution3:矩阵法

时间复杂度 O(logn) O ( l o g n )

参考博客网址:
主要思路:
这里写图片描述
这里写图片描述
现在我们主要要知道如何求:这里写图片描述。我们可以采用分治法,具体来讲是二分法来解决这个问题:
这里写图片描述
这样我们可以写出代码如下:

//定义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 )

斐波那切数列的通项公式:
这里写图片描述

class Solution {public:    int Fib(int n) {        const double s = sqrt(5);        return (pow((1+s)/2, n) - pow((1-s)/2, n))/s;    }}
你可能感兴趣的文章
1024 Palindromic Number-PAT甲级
查看>>
1025 PAT Ranking-PAT甲级
查看>>
剑指Offer_包含min函数的栈
查看>>
剑指Offer_二叉搜索树的后序遍历序列
查看>>
剑指Offer_二叉树中和为某一值的路径
查看>>
SPFA单源最短路算法
查看>>
差分约束系统
查看>>
C++ Maps
查看>>
C++ Priority Queues(优先队列)
查看>>
1083 List Grades-PAT甲级
查看>>
1081 Rational Sum -PAT甲级(分数运算)
查看>>
1075 PAT Judge-PAT甲级
查看>>
K8s概述:几种集群方案的对比
查看>>
爱了!阿里内部学习指南“Springboot全套成长笔记”,从精通原理到掌握项目
查看>>
java程序员:拜托别再问我Spring原理了!你问的这篇文章都有
查看>>
独角兽余额宝(Java现场面试48题):性能调优+索引+Mysql+缓存+HashMap+GC
查看>>
面试Java岗没找到合适的面试刷题资源?这份pdf够你甩别人几条街
查看>>
毕业三年,从小公司到大厂,先后四面阿里、小米、美团等,终于收到offer!
查看>>
面试磕磕碰碰,辛得蚂蚁高级工程师的技术笔记指导,终获P7岗offer
查看>>
真是太刺激了!美团CTO五轮面试,Java岗高级工程师一二三四五面面经(已拿到offer)
查看>>