剑指offer第10 计算斐波那契

题目

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上的斐波那契来做

发布了33 篇原创文章 · 获赞 37 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/hagle_wang/article/details/104869617