求斐波那契数列的第 n 项,n <= 39。
用递归的话,会有重复计算:
图片来自:https://cyc2018.github.io/CS-Notes/#/notes/剑指 Offer 题解 - 10~19
递归是将一个问题划分成多个子问题求解,动态规划也是如此,但是动态规划会把子问题的解缓存起来,从而避免重复求解子问题。
public class Solution {
public int Fibonacci(int n) {
if(n<=1){
return n;
}
int [] fib = new int[n+1];
fib[1]=1;
for(int i=2;i<=n;i++){
fib[i]=fib[i-1]+fib[i-2];
}
return fib[n];
}
}
考虑到第 i 项只与第 i-1 和第 i-2 项有关,因此只需要存储前两项的值就能求解第 i 项,从而将空间复杂度由 O(N) 降低为 O(1)。
public class Solution {
public int Fibonacci(int n) {
if(n<=1){
return n;
}
int pre2=0,pre1=1;
int fib=0;
for(int i=2;i<=n;i++){
fib=pre1+pre2;//把之前的结果保存下来
pre2=pre1;
pre1=fib;
}
return fib;
}
}
n小于40,可以直接将前40项计算,降低时间复杂度为o(1)
public class Solution {
private int[] fib=new int[40];
public Solution(){
fib[1]=1;
for(int i=2;i<fib.length;i++){
fib[i]=fib[i-1]+fib[i-2];
}
}
public int Fibonacci(int n){
return fib[n];
}
}