斐波那契数列
作为递归入门算法,我却仅仅学习了这题的递归解法,惭愧惭愧。今天来总结一下这道题的所有解法
1、递归解法
class Solution {
public:
int Fibonacci(int n) { //每3个一组,整成动态二维数组
// write code here
if(n<=2){
return 1;
}else {
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
};
2.1非递归解法一
考虑到递归时间复杂度太高,对于输入的数较大时,会引起很多不必要的计算,所以我们可以考虑使用一个数组来记录一下计算的值,这样第二次就可以直接访问到答案了;
class Solution {
public int fib(int n) {
if(n < 2)
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.2非递归解法二
思考一下,这个问题每次计算都是f(n) = f(n-1) + f(n-2); 那么上面那种解法先算出数据再放到数组里,那么真的需要所有数据都要存储吗? 不是的,我们计算也就只需要前两个数,所以我们只定义两个变量用来存储前面两个数就行了,边计算边存储!
class Solution {
public int fib(int n) {
int num1 = 0; //暂时先用来存储f(0),后来用于存储f(n-2)
int num2 = 1; //暂时先用来存储f(1), 后来用于存储f(n-1)
int sum; //用来存储f(n)
int i = 2; //遍历循环遍历
if(n < 2)
return n;
while((i++)<=n){
sum = num1 + num2;
num1 = num2;
num2 = sum;
}
return sum;
}
}
结束!