【问题描述】
大家都知道斐波那契数列,现在要求输入一个整数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;}
}
【总结】
- 递归需要定义出口,从传递的参数过渡到出口
- 综合考虑时间复杂度和空间复杂度