算法学习#9 斐波那契数列(三种解法)

题目详情

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:

F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

示例 1:

输入:输入:n = 5
输出:5

Java代码(暴力递归)

class Solution {
    public int fib(int n) {
        if(n == 0){
            return 0;
        }else if (n == 1){
            return 1;
        }
        return fib(n-1) + fib(n-2);
    }
}

这个应该没啥可说的,在leetcode上面会超出时间限制,时间复杂度是2的n次幂


暴力递归.png


Java代码(数组去重)

    public int fib(int n) {
        int[] arr = new int[n + 1];
        if(n == 0){
            return 0;
        }else if(n == 1){
            return 1;
        }
        arr[0] = 0;
        arr[1] = 1;
        for(int i = 2; i <= n;i++){
            arr[i] = arr[i-1] + arr[i-2];
        }
        return arr[n];  
    }


Java代码(去重递归)

class Solution {
    public static int fib(int n) {
        int[] arr = new int[n + 1];
        return recurse(arr,n);
    }

    private static int recurse(int[] arr,int n){
        if(n == 0){
            return 0;
        }
        if(n == 1){
            return 1;
        }
        if(arr[n] != 0){
            return arr[n];
        }
        arr[n] = recurse(arr,n-1) + recurse(arr,n-2);
        return arr[n];

    }
}


Java代码(动态规划 && 双指针)

class Solution {
    public static int fib(int n) {
        int slow = 0;
        int fast = 1;
        int temp = 0;
        if(n == 0){
            return slow;
        }
        for(int i = 2;i <= n;i++){
            temp = slow + fast;
            slow = fast;
            fast = temp;
        }
        return fast;

    }
}

总结

因为时间复杂度高是因为重复计算了相同的元素位数,所以可以考虑使用数组来保存计算出的元素,这样就可以降低时间复杂度。
但是使用去重会引入一个数组,所以增加了空间复杂度。但实际上我们只需要两位就可以知道下一位是什么。而不是需要计算出整个数组,所以有了第三种算法,至引入两个指针,一直向右移动来计算下一位


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容