首页 > 其他 > 详细

斐波那契数列(剑指offer_10.1)

时间:2019-12-25 14:19:35      阅读:95      评论:0      收藏:0      [点我收藏+]

题目描述


求斐波那契数列的第n项,n <=39。

技术分享图片

 

 解题思路


如果使用递归求解,会重复计算一些子问题。例如,计算f(4)需要计算f(3)和f(2),计算f(3)需要计算f(2)和f(1),可以看到f(2)被重复计算了。

技术分享图片

 

递归是将一个问题划分为多个子问题求解,动态规划也是如此,但是动态规划会把子问题的解缓存起来,从而避免重复求解子问题。

public int Fibonacci(int n)
{
    if(n <= 1)
        return n;
    int[] fib = new int[n+1];
    fib[1] = 1;
    for(int i =2;i<=n;i++)
        fib[i] = fib[i-1] + fib[i-2];
    return fib[n];
}

考虑到第i项只与第i-1项和第i-2项有关,因此只需要存储前两项的值就能求解第i项,从而将空间复杂度由O(N)降低为O(1)。

public int Fibonacci(int n)
{
    if(n <=1)
        return n;
    int pre2 = 0, pre1 = 1;
    int fib = 0;
    for (int i = 2;i <= n;i++)
    { 
        fib = pre2 + pre1;
        pre2 = pre1;
        pre1 = fib;
    }
    return fib;
}

由于待求解的n小鱼40,因此可以将前40 项的结果先行计算,之后就能O(1)时间复杂度得到第n项的值。

public class Solution
{
    private int[] fib = new int[40];
    public Solution()
    {
        fib[1] = 1;
        for(int i = 2; i < fib.length; i++)
            fib[i] = fib[i-1] + fib[i-2];
    }

    public int Fibonacci(int n)
    {
        return fib[n];
    }
}

斐波那契数列(剑指offer_10.1)

原文:https://www.cnblogs.com/ziytong/p/12096141.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!