题目:
1 、1、2、3、5、8....计算103的值
规律:f(n)=f(n-1)+f(n-2)
基础版:算法实现
public static int getResult(int num){ if (num<=2) return 1; return getResult(num - 1) + getResult(num - 2); }
备忘录模式的递归(缓存之前计算的结果减少重叠子问题的求解)O(N):
private static final Map<Integer, Long> cache = new HashMap<>(); public static long getResult(int num){ if (num<=2) return 1; return cache.computeIfAbsent(num,k->getResult(num - 1) + getResult(num - 2)) ; }
computeIfAbsent() 方法对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hashMap 中
动态规划方式O(N)
public static int getResult2(int n) { if (n == 0) return 0; if (n == 1 || n == 2) return 1; int[] dp = new int[n + 1]; dp[0] = dp[1] = 1; for (int i = 2; i <= n; i++) { dp[i] = dp[i - 1] + dp[i - 2]; } return dp[n]; }
状态压缩 O(1)
public static int getResult3(int n) { if (n == 0) return 0; if (n == 1 || n == 2) { return 1; } int prev = 1; int current = 2; for (int i = 3; i <= n; i++) { int sum = prev + current; prev = current; current = sum; } return current; }