美文网首页
斐波那契数列

斐波那契数列

作者: BestbpF | 来源:发表于2019-01-09 17:26 被阅读11次

    简述

    断断续续刷了一百多道leetcode简单题了,今天突然看见新增了一道斐波那契数列,十分经典,下面给出三种解法。

    题目

    斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
    F(0) = 0, F(1) = 1
    F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
    给定 N,计算 F(N)。

    解题

    【解法一递归
        public int fib(int N) {
            if(N < 2) return N;
            return fib(N - 1) + fib(N - 2);
        }
    

    很容易理解,从第三项开始,每一项数字都是前面两项数字的和,这种方式效率不是很高,因为有大量的重复计算,如f(5)需要计算f(3)与f(4),f(6)又计算f(5),f(5)又计算f(4).... ,时间复杂度为O(2^n)

    【解法二动态规划
        public int fib(int N) {
            //dp[N] = dp[N - 1] + dp[N - 2];
            int[] dp = new int[N + 1];
            if(N == 0) return 0;
            dp[0] = 0;
            dp[1] = 1;
            for(int i = 2; i <= N; i ++){
                dp[i] = dp[i - 1] + dp[i - 2];
            }
            return dp[N];
        }
    

    dp方程为dp[N] = dp[N - 1] + dp[N - 2],用数组保存每个N对应的值,用的时候直接拿,不需要重复计算,时间复杂度为O(n)

    【解法三遍历
        public int fib(int N) {
            if(N < 2) return N;
            int a = 0;
            int b = 1;
            int c = 0;
            for(int i = 2; i <= N; i ++){
                c = a + b;
                a = b;
                b = c;
            }
            return c;    
        }
    

    也很好理解,c = a + b,运算完成后,重新赋值,相当于右移一下,时间复杂度为O(n)

    相关文章

      网友评论

          本文标题:斐波那契数列

          本文链接:https://www.haomeiwen.com/subject/mlvgrqtx.html