1 解题思路
- 声明定义一个由-1填充的数组arr,在索引为n的地方存储f(n),-1表示尚未存储数据;
- 若n = 0或1,直接返回n本身;
- 若不满足2,判断arr[n]若不是-1,说明已经存储过f(n),不需要再进行计算,直接返回arr[n];
- 若不满足3,进行计算f(n) = f(n - 1) + f(n - 2),并在arr[n]存储f(n)结果;
2 Java代码实现
public class Solution {
public int Fibonacci(int n) {
// 1. 声明定义一个由-1填充的数组arr,在索引为n的地方存储f(n),-1表示尚未存储数据;
int[] arr = new int[128];
for (int i = 0; i < arr.length; ++i) {
arr[i] = -1;
}
return fib(arr, n);
}
private int fib(int[] arr, int n) {
// 2. 若n = 0 或 1,直接返回n本身;
if (n == 0 || n == 1) return n;
// 3. 若不满足2,判断arr[n]若不是-1,说明已经存储过f(n),不需要再进行计算,直接返回arr[n];
if (arr[n] != -1) {
return arr[n];
} else {
// 4. 若不满足3,进行计算f(n) = f(n - 1) + f(n - 2),并在arr[n]存储f(n)结果;
int result = fib(arr, n - 1) + fib(arr, n - 2);
arr[n] = result;
return result;
}
}
}