package leecode;

/**
* 斐波那契数列
* 利用备忘录形式解决重叠子问题
*
* @author Tang
* @date 2021/9/6
*/
public class Fibonacci {

int[] nums;

/**
* 方法一:
* 备忘录方法
* @param n
* @return
*/
public int doIt(int n){

nums = new int[n];
return execute(n);
}

private int execute(int n) {
if(nums[n - 1] != 0) {
return nums[n - 1];
}

if(n == 1 || n == 2) {
nums[n - 1] = 1;
return nums[n - 1];
}
int value = execute(n - 1) + execute(n - 2);
nums[n - 1] = value;
return nums[n - 1];
}

/**
* 方法二:
* dp table构建
* @param n
* @return
*/
public int doIt2(int n){
int[] nums = new int[n];

//先计算出每一个元素的值
for(int i = 0; i < n; i++) {
if(i <= 1) {
nums[i] = 1;
continue;
}
nums[i] = nums[i - 1] + nums[i - 2];
}
return nums[n - 1];
}

public static void main(String[] args) {
Fibonacci fibonacci = new Fibonacci();
int execute = fibonacci.doIt2(10);
System.out.println(execute);

}




}