斐波那契数列

简述

断断续续刷了一百多道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)

你可能感兴趣的:(斐波那契数列)