斐波那契数列
动态规划初试——简单
现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n <= 39
递归常规解法
空间复杂度高,时间复杂度高,易理解
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);
}
}
动规解法
第i项的值等于第i-1项 与 第i-2项的和;
第i-1项?第i-2项?
状态分析:dp[i] 表示第i项的值
状态方程:dp[i] = dp[i-1] + dp[i-2];
初始值:dp[0] = 0;
dp[1] = 1;
返回结果:dp[i];
public class Solution {
public int Fibonacci(int 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];
}
}
优化:
我们发现只需要记录前两项的值即可;
public class Solution {
public int Fibonacci(int n) {
if(n == 0)
return 0;
if(n == 1)
return 1;
int fi2 = 0;
int fi1 = 1;
int fi = 0;
for(int i=2;i<=n;i++){
fi = fi1+fi2;
//状态更新
fi2 = fi1;
fi1 = fi;
}
return fi;
}
}
这时我们发现时间复杂度和空间复杂度有了极大的提升
重点是对动态规划有了初步认识
动规一点也不难!!!?