跳转至

10.1.斐波那契数列 (Easy)*

题目描述*

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1

F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

提示*

0 <= n <= 100

代码*

递归或迭代,迭代就不用求重复解了。

剑指 offer 提供了以下的公式:

\begin{bmatrix} f(n) & f(n - 1) \\ f(n - 1) & f(n - 1) \end{bmatrix} = {\begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}}^{n - 1}

使用快速幂算法计算矩阵的幂。

class Solution {
public:
    int fib(int n) {
        if(n <= 1) {
            return n;
        }
        int res = 0, n1 = 1, n2 = 0;
        while(n-- >= 2) {
            res = (n1 + n2) % 1000000007;
            n2 = n1;
            n1 = res;
        }
        return res;
    }
};
struct Matrix2By2 {
    Matrix2By2 (long long m00 = 0, long long m01 = 0, long long m10 = 0, long long m11 = 0) : m_00(m00), m_01(m01), m_10(m10), m_11(m11) { }

    long long m_00;
    long long m_01;
    long long m_10;
    long long m_11;
};

Matrix2By2 MatrixMultiply(const Matrix2By2& matrix1, const Matrix2By2& matrix2) {
    return Matrix2By2(
        (matrix1.m_00 * matrix2.m_00 + matrix1.m_01 * matrix2.m_10) % 1000000007,
        (matrix1.m_00 * matrix2.m_01 + matrix1.m_01 * matrix2.m_11) % 1000000007,
        (matrix1.m_10 * matrix2.m_00 + matrix1.m_11 * matrix2.m_10) % 1000000007,
        (matrix1.m_10 * matrix2.m_01 + matrix1.m_11 * matrix2.m_11) % 1000000007);
}

Matrix2By2 MatrixPower(unsigned int n) {
    Matrix2By2 matrix;
    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;
}
class Solution {
public:
    int fib(int n) {
        if (n <= 1) {
            return n;
        }
        Matrix2By2 res = MatrixPower(static_cast<unsigned int>(n - 1));
        return res.m_00 % 1000000007;
    }
};

最后更新: July 23, 2022