【剑指offer】面试题9:斐波那契数列

题目

写一个函数,输入n, 求斐波那契数列的第n项。

递归

问题规模为:
T(n)=T(n1)+T(n2)
如果我们估计一下,让 T(n1)=T(n2)
那么 T(n)=2T(n1)
那么 O(n)=2n

简介而不高效

long long Fibonacci(int n) {
    if (n <= 0) return 0;
    if (n == 1) return 1;
    return Fibonacci(n - 1) + Fibonacci(n - 2);
}

递推

一次遍历,复杂度为 O(n)
个人觉得是最优,省空间,省时间

long long Fibonacci(int n) {
    if (n <= 0) return 0;
    if (n == 1) return 1;
    long long n2 = 0;
    long long n1 = 1;
    long long n0;
    for (int i = 2; i <= n; i ++) {
        n0 = n2 + n1;
        n2 = n1;
        n1 = n0;
    }   
    return n0;
}

矩阵乘法

原理就是:

[f(n)f(n1)f(n1)f(n2)]=[1110]n1

如果加上快速幂的话,复杂度可以变为 O(logn)

我自己实现之前用类实现了一个矩阵,重载了^, *等运算符,具体在:
https://github.com/preke/AimToOffer/blob/master/class_matrix.c%2B%2B

所以下面的实现只写函数:

Matrix FastPower(const Matrix & m, int n) {
    if (n == 1) {
        return m;
    }
    if (n % 2 == 0) {
        return FastPower(m, n/2) * FastPower(m, n/2);
    } else {
        return FastPower(m, (n - 1)/2) * FastPower(m, (n - 1)/2) * m;
    }
}

Matrix m = Matrix(2, 2); //在此我们输入 1,1,1,0 初始化这个矩阵
int Fibonacci(int n) {
    if (n <= 0) return 0;
    if (n == 1) return 1;   
    Matrix m1 = m;
    m1 = FastPower(m1, n-1);
    return m1.get(0, 0); //为f(n)
}


int main() {
    for(int i = 0; i < 10; i ++)
        cout << Fibonacci(i) << endl;

}

(数据类型这里用int,如果要用大数的话,可以自己换数据类型)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值