自学内容网 自学内容网

leetcode 506 斐波那契数

一、问题描述

二、解题思路

(1)解法一:直接递归

按照题目意思,直接暴力递归,这种方法重复计算太多。

(2)解法二:记忆化搜索

由于解法一重复计算太多,比如在计算fib(5)的时候需要计算fib(3)和fib(4),在计算fib(4)的时候也要计算fib(3),重复计算过多。

我们可以用一个数组,将前面计算过的结果存储起来,如果需要的结果是前面计算过的,就直接使用即可。

(3)解法三:动态规划

由于fib(n)=fib(n-2)+fib(n-1),所以,可以开辟一个数组dp来存放相应的斐波那契数值,dp[i]的值为fib(i)的值。

(4)解法四:滚动数组

由于fib(n)只与fib(n-1)与fib(n-2)有关,所以只需要保存前面的两个数即可。

三、代码实现

解法一:直接递归

class Solution {
public:
    int fib(int n) {
        if(n==0) return 0;
        if(n==1) return 1;
        return fib(n-1)+fib(n-2);
    }
};

解法二:记忆化搜索

class Solution {
    vector<int> memo;
public:
    int fib(int n) {
        //边界处理
        if(n==0) return 0;
        if(n==1) return 1;
        
        memo.resize(n+1,-1);
        memo[0]=0;
        memo[1]=1;
        return dfs(n);
    }

    int dfs(int n){
        //如果memo中有,直接返回
        if(memo[n]!=-1) return memo[n];
        //如果memo中没有,则存入memo
        else{
            memo[n]=dfs(n-2)+dfs(n-1);
            return memo[n];
        }
    }
};

解法三:动态规划

class Solution {
public:
    int fib(int n) {
        //边界处理
        if(n==0) return 0;
        if(n==1) return 1;

        //填写dp数组
        vector<int> dp(n+1,0);
        dp[0]=0;dp[1]=1;
        for(int i=2;i<=n;i++) 
            dp[i]=dp[i-1]+dp[i-2];

        return dp[n];
    }
};

解法四:滚动数组

class Solution {
public:
    int fib(int n) {
        //边界处理
        if(n==0) return 0;
        if(n==1) return 1;
        
        int a,b,c;
        a=0;b=1;
        for(int i=2;i<=n;i++) {
            c=a+b;
            a=b;
            b=c;
        }
        return c;
    }
};

原文地址:https://blog.csdn.net/2301_80296866/article/details/152952648

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!