一、暴力求解
时间复杂度O(2n)
public static int calcuate(int num) {
if (num == 0) {
return 0;
}
if (num == 1) {
return 1;
}
return calcuate(num - 1) + calcuate(num - 2);
}
二、去重递归
时间复杂度O(n) 空间复杂度O(n)
public static int calcuate2(int num) {
int[] arr = new int[num + 1];
return recurse(arr, num);
}
private static int recurse(int[] arr, int num) {
if (num == 0) {
return 0;
}
if (num == 1) {
return 1;
}
if (arr[num] != 0) {
return arr[num];
}
arr[num] = recurse(arr, num - 1) + recurse(arr, num - 2);
return arr[num];
}
三、双指针迭代
时间复杂度O(n) 空间复杂度O(1)
public static int calcuate3(int num) {
if (num == 0) {
return 0;
}
if (num == 1) {
return 1;
}
int f0 = 0;
int f1 = 1;
for (int i = 2; i <= num; i++) {
int sum = f0 + f1;
f0 = f1;
f1 = sum;
}
return f1;
}