1.最直白的解决手段,递归
递归存在许多子问题的重复计算问题,时间复杂度较高。
public class FBSL{
int n ;
public FBSL(int n ){
this.n = n ;
}
public static int FB(int n){
if(n > 2)return n;
return FB(n-1)+FB(n-2);
}
}
还有一种记忆化搜索的优化方式
首先我们需要一个全局的哈希表来存储当你第n个数所对应的前两个数的和。
class FB{
HashMap<Integer,Integer> map = new HashMap<>();
public int FB(int n){
if(n < 2){
return n ;
}
//一旦发现我曾经计算过我就不再递归计算,直接返回map集合存的值
if(map.get(n) != null){
return map.get(n) ;
}
int res = FB(n-1)+FB(n-2);
map.put(n,res) ;
return res;
}
DP----首先确定状态转移方程:
FB[n] = FB[n-1] + FB[n-2]
public static void FB(int n){
int[] FB = new int[n];
FB[0] = 0 ;
FB[1] = 1 ;
for(int n = 2 ; i < n ; n++){
FB[n] = FB[n-1] + FB[n-2] ;
}
return FB[n-1] ;
}