剑指 Offer 10- I. 斐波那契数列
方法一:利用哈希表记录已经计算过的数,减小时间复杂度
class Solution {
public:
unordered_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];
}
else
{
int a = dfs(n-1)%1000000007;
mp[n-1] = a;
int b = dfs(n-2)%1000000007;
mp[n-2] = b;
int res = (a+b)%1000000007;
mp[n] = res;
return mp[n];
}
}
int fib(int n) {
return dfs(n);
}
};
时间复杂度为O(N)
空间复杂度为O(N)
这道题有更好的方法,不需要增大空间复杂度
动态规划:
动态规划解析:
- 状态定义:设dp为一维数组,dp[i]代表斐波那契额第i个数字
- 状态方程:dp[i] = dp[i-1]+dp[i-2]
- 初始状态:dp[0]和dp[1]
- 返回值dp[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];
}
};
时间复杂度为O(N)
空间复杂度为O(N)
class Solution {
public:
int fib(int n) {
int a,b,c;
vector<int>dp;
if(n==0)
{
return 0;
}
if(n==1)
{
return 1;
}
for(int i = 0;i<=n;i++)
{
if(i == 0)
{
a = 0;
}
else if(i == 1)
{
b = 1;
}
else
{
c = (a+b)% 1000000007;
a = b; b = c;
}
}
return c;
}
};
不建立数组使得空间复杂度降低为o(1)