力扣509. 斐波那契数

题目:

斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

示例:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

解法

两种方法,自顶向下;自底向上。

代码

//Botton-up
//自底向上
class Solution {
public:
    int fib(int n) {
        if (n == 0) return 0;
        vector<int> Fibonacci(n + 1);
        Fibonacci[0] = 0;
        Fibonacci[1] = 1;
        for (int i = 1; i < n; i++) {
            Fibonacci[i+1] = Fibonacci[i] + Fibonacci[i - 1];
        }
        return Fibonacci[n];
    }
};
//Top-down
//自顶向下
class Solution {
public:
    int fib(int n) {
        if (n < 2) {
            return n;
        }
        return fib(n - 1) + fib(n - 2);
    }
};
### 力扣509题:斐波那契力扣509题的目标是计算给定索引 `n` 的斐波那契值。斐波那契列定义如下: - F(0) = 0, - F(1) = 1, - 对于 n >= 2,F(n) = F(n - 1) + F(n - 2)[^6]。 以下是该问题的一种高效解决方案,采用动态规划的思想来减少重复计算并优化时间复杂度。 #### 方法一:迭代法 通过自底向上的方式构建斐波那契序列,仅保留最后两个状态以节省空间。 ```c int fib(int n){ if (n == 0 || n == 1) { return n; } int prev = 0, curr = 1; for (int i = 2; i <= n; ++i) { int nextVal = prev + curr; prev = curr; curr = nextVal; } return curr; } ``` 此方法的时间复杂度为 O(n),而由于只存储了最近的两个值,因此其空间复杂度仅为 O(1)[^7]。 #### 方法二:矩阵快速幂 利用线性代中的性质可以加速求解过程。具体来说,可以通过矩阵乘法规则将指运算转化为对次操作完成。 设初始条件为: \[ \begin{bmatrix} F_{1}\\ F_{0}\end{bmatrix}= \begin{bmatrix} 1\\ 0\end{bmatrix}, M= \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}. \] 那么对于任意正整 k ,有关系式成立: \[M^{k} * V=\begin{bmatrix} F_{k+1}\\ F_{k}\end{bmatrix}[^8].\] 基于上述理论可编写相应代码实现: ```c void multiply(long long F[2][2], long long M[2][2]) { long long x = F[0][0]*M[0][0] + F[0][1]*M[1][0]; long long y = F[0][0]*M[0][1] + F[0][1]*M[1][1]; long long z = F[1][0]*M[0][0] + F[1][1]*M[1][0]; long long w = F[1][0]*M[0][1] + F[1][1]*M[1][1]; F[0][0] = x % INT_MAX; F[0][1] = y % INT_MAX; F[1][0] = z % INT_MAX; F[1][1] = w % INT_MAX; } void power(long long F[2][2], int n) { if (n == 0 || n == 1) return; long long M[2][2] = {{1, 1}, {1, 0}}; power(F, n / 2); multiply(F, F); if (n % 2 != 0) multiply(F, M); } long long fibonacci(int n) { long long F[2][2] = {{1, 1}, {1, 0}}; if (n == 0) return 0; power(F, n - 1); return F[0][0]; } ``` 这种方法虽然较为复杂,但是能够显著提升性能,在处理大输入据时尤为明显[^9]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值