题解-斐波那契数列
4种做法
最简单:
递归算法
class Solution {
public:
int Fibonacci(int n) {
if(n == 0 || n == 1)
{
return n;
}
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
};时间复杂度
优化:动态规划:
状态转移方程:
class Solution {
public:
int Fibonacci(int n) {
if(n == 0 || n == 1)
{
return n;
}
int* dp = new int[n+1];
dp[0] = 0 ;
dp[1] = 1 ;
for(int i = 2 ; i <= n;i++)
{
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
};时间复杂度
空间复杂度
进一步优化,我们发现每次计算只用到
那么保存2个临时变量即可。
class Solution {
public:
int Fibonacci(int n) {
if(n == 0 || n == 1)
{
return n;
}
int i_2 = 0;
int i_1 = 1;
int now;
for(int i = 2 ; i <= n; i++)
{
now = i_2 + i_1;
i_2 = i_1;
i_1 = now;
}
return now;
}
};再进一步,可以发现
所以只需要1个临时变量即可:
class Solution {
public:
int Fibonacci(int n) {
if(n == 0 || n == 1)
{
return n;
}
int i_1 = 0;
int now = 1;
for(int i = 2 ; i <= n; i++)
{
now = now + i_1;
i_1 = now - i_1;
}
return now;
}
};