题目
https://leetcode-cn.com/problems/fibonacci-number/solution/fei-bo-na-qi-shu-by-leetcode/
思路
第一种方法使用递归,但是耗时间太长,因为有很多是重复计算,所以使用map保存中间变量,因为求f(n)只需要f(n-1)和f(n-2)即可 所以只需要保存前俩个计算结果即可
代码
public class N10FeiBoNaQiShuLieLco {
private static Map<Integer,Integer> map = new HashMap<>();
//使用递归实现
public static int fib(int n) {
if(n==0||n==1){
return n;
}else {
return fib(n-1)+fib(n-2);
}
}
//保存中间结果
public static int fib2(int n) {
if(n==0||n==1){
return n;
}
if(map.containsKey(n)) {
return map.get(n);
}
int sum = fib(n - 1) + fib(n - 2);
map.put(n, sum);
return sum;
}
//升级方法二 不用保存全部中间值 自底向上
// 要求f(n) 那我只要知道f(n-1) 和f(n-2)即可 所以从f(0)一直计算到f(n)即可
public static int fib3(int n){
if(n<=1){
return n;
}
int fibNminus1 = 1;
int fibNminus2 = 0;
int fibn = 0;
for (int i = 1; i < n; i++) {
fibn = fibNminus1+fibNminus2;
fibNminus2 = fibNminus1;
fibNminus1 = fibn;
}
return fibn;
}
public static void main(String[] args) {
System.out.println(fib3(3));
}
}
后记 俩个惊喜
1.剑指offer的答案写错了 应该是从0开始循环的, 人家是对的,是我特么没理解 尴尬了,,,
2.leetcode剑指offer判断也是错的,还得使用之前LeetCode上的斐波那契来做