写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
递归
public int fib(int n) {
if (n == 0){
return 0;
}
if (n == 1){
return 1;
}
return fib(n-1) + fib(n-2);
}
采用递归方式解决该问题时间复杂度很高:O(2^n)
动态规划
1.在递归过程中存在重叠子问题
初始化dp表:dp[0] = 0;dp[1] = 1;
状态转移方程:dp[n] = dp[n-1]+dp[n-2];
public int Fibonacci(int n) {
int[] dp = new int[n+1];
if (n == 0){
return 0;
}
dp[0] = 0;
dp[1] = 1;
for (int i = 2;i <= n; i++){
dp[i] = dp[i-1]+dp[i-2];
}
return dp[n];
}
动态规划空间复杂度优化
当前状态只与几个状态有关时,可以不建立全部的dp表,减少空间复杂度
public int Fibonacci(int n) {
if (n == 0){
return 0;
}
int pre0 = 0,pre1 = 1,ans = 1;
for (int i = 2; i <= n; i++){
ans = pre1 + pre0;
pre0 = pre1;
pre1 = ans;
}
return ans;
}