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

力扣链接
Java版答案:

class Solution {
    public int fib(int n) {
        int res = 0, pre0 = 0, pre1 = 1;
        if (n == 1) {
            return 1;
        }
        while (n > 1) {
            res = (pre0 + pre1) % 1000000007;
            pre0 = pre1;
            pre1 = res;
            --n;
        }

        return res % 1000000007;
    }
}

原文:
另一个相关的链接:https://blog.csdn.net/Allenlzcoder/article/details/80297333
总结下求斐波那切数列的4中方法
##Solution1:递归法
代码复杂度为 O ( 2 n ) O(2^n) O(2n),简单却不是一个好思路呀~

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)=1
        if(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 ( l o g n ) 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;
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值