斐波那契递归与迭代方式


初学算法和数据结构,直接就用了一下的递归。结果很显然,超时了。

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 {
public:
    map<int, int>mp;
    int dfs(int n)
    {
        if (n == 0)
            return 0;
        else if (n == 1)
            return 1;
        else if (mp.count(n))
            return mp[n];
        mp[n - 1] = dfs(n - 1) % 1000000007;
        mp[n - 2] = dfs(n - 2) % 1000000007;
        mp[n] = (mp[n - 1] + mp[n - 2]) % 1000000007;
        return mp[n];
    }
    int fib(int n) {
        return dfs(n);
    }
};

还看到了另一种方法,简单的迭代。

创建一个数组来存放值。

class Solution {
public:
    int fib(int n) {
        vector<int> dp;
        for(int i=0;i<=n;i++)
        {
            if(i==0)
            {
                dp.push_back(0);
            }
            else if(i==1)
            {
                dp.push_back(1);
            }
            else
                dp.push_back((dp[i-1]+dp[i-2])%1000000007);
        }
        return dp[n];
    }
};

相关