斐波那契数列问题
1.递归
int Fibonacci(int n) {
if(n==1|n==2)
return 1;
return Fibonacci(n-1)+Fibonacci(n-2);
}
时间复杂度:O(2^n)
空间复杂度:递归栈的空间
2.记忆化搜索
解决重复计算问题,用数组保存计算过的结果
int f[40] = {0};
int Fibonacci(int n){
if(n<=2)
f[n] = 1;
if(f[n]!= 0)
return f[n];
return f[n] = (Fibonacci(n-1) + Fibonacci(n-2));
}
时间复杂度:O(n)
没有重复的计算
空间复杂度:递归栈的空间+数组空间
3.动态规划
递归是从上往下递归,从下往上回溯的,最后回溯的时候合并子树,求得答案。
动态规划可以不用递归的过程,直接从子树求得答案。过程是从下往上。
int dp[40] = {0};
int Fibonacci(int n){
dp[1] = 1; dp[2] = 1;
for(int i = 3;i <= n;i++)
dp[i] = dp[i-1] + dp[i-2];
return dp[n];
}
时间复杂度:O(n)
空间复杂度:O(n)
节省空间的角度考虑,可以只储存两个变量
int Fibonacci(int n){
int a = 0;
int b = 1;
while(n--){
b += a;
a = b - a;}
return a;
}
时间复杂度O(n)
空间复杂度O(1)