【问题描述】
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
【解答思路】
1.递归(面试避免) O(n^2)
public class Solution {
public int Fibonacci(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
2.一般循环 O(n) 空间复杂度:O(n)
public class Solution {
public int Fibonacci(int n) {
int ans[] = new int[40];
ans[0] = 0;
ans[1] = 1;
for(int i=2;i<=n;i++){
ans[i] = ans[i-1] + ans[i-2];
}
return ans[n];
}
}
3.循环优化 O(n) 空间复杂度:O(1)
0 1 1 2 3 5 8
f(6) = f(5) + f(4),只需要保存f(5) , f(4) 由f(5) -f(3) 得出
计算8 = 5+3时,只需要保存5, 3由5-2得出
public class Solution {
public int Fibonacci(int n) {
int a = 0, b = 1;
for (int i = 1; i <= n - 2; i++) {
a = a + b;
b = a - b;
}
return a;
}
}
【总结】
- 递归需要定义出口,从传递的参数过渡到出口
- 综合考虑时间复杂度和空间复杂度