C++实现对斐波那契数列的优化

知道程序递归实现算法的程序员一般都接触过斐波那契数列,即:
F(n)={1,n=1;1,n=2;F(n-1)+F(n-2)}
递归代码如下:

int Fib1(int n)
{
    if (n<1)
    {
        return -1;
    }
    if (n==1||n==2)
    {
        return 1;
    }
    return  Fib1(n - 1) + Fib1(n - 2);
}


但是它的时间复杂度是:

                              在这里插入图片描述
请注意,是指数级!
所以,接下来给出优化版实现:
分析:事件复杂度较高的原因是:每次计算n的时候,都要重复计算n-1和n-2,因此增大了事件复杂度,如果事先用数组保存之前的数据,就会减少计算次数:

int Fib2(int n)
{
    if (n<1)
    {
        return -1;
    }
    int *array = new int[n];
    array[0] = 1;
    array[1] = 1;
    for (int i=2;i<n;i++)
    {
        array[i] = array[i - 1] + array[i - 2];
    }
    return array[n-1];
}



上面的代码瞬间将指数级降至O(n)级别,但是有没有更好的算法呢,有的,请继续看:

 

int Fib3(int n)
{
    int a1 = 1;
    int a2 = 1;
    if (n<1)
    {
        return -1;
    }
    if (n==1||n==2)
    {
        return 1;
    }
    for (int i=3;i<=n;i++)
    {
        a2 = a2 + a1;
        a1 = a2 - a1;
    }
    return  a2;
}


这样,虽然时间复杂度没有改变,但是空间复杂度再次降低

更简单

 

class Solution {

public:

    int climbStairs(int n) {

        int f = 1;

        int g = 0;

        while(n--){

            f += g;

            g = f -g;           

        }

        return f;

    }

};

 
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值