[杨小白]_java_leetcode 509.斐波那契数

81 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

509.斐波那契数

509. 斐波那契数

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1

F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n) 。

示例1

输入: n = 2

输出: 1

解释: F(2) = F(1) + F(0) = 1 + 0 = 1

示例2

输入: n = 3

输出: 2

解释: F(3) = F(2) + F(1) = 1 + 1 = 2

示例3

输入: n = 4

输出: 3

解释: F(4) = F(3) + F(2) = 2 + 1 = 3

2.解析

斐波那契数列算是最基础的算法之一了,从学习递归算法时就接触过了。

2.1解法(递归)

最容易想到的解法那就是递归求解。代码简洁,易懂。但是递归在数目较大情况下经常会出现栈溢出的情况。空间复杂度O(n),时间复杂度O(2^n)。

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

提交排名

image.png

2.2解法(记忆数组)

在解法1的基础上进一步思考,能否用O(n)的时间复杂度完成呢?

这里用db记忆数组,实现时间复杂度O(n),空间复杂度也是O(n),也完美的解决了栈溢出。

class Solution {
    public int fib(int n) {
        int[] db = new int[32];
        db[0] = 0;
        db[1] = 1;
        for(int i = 2; i <= n; i++) {
            db[i] = db[i-1] + db[i-2];
        }
        return db[n];
    }
}

提交排名

image.png

3.结束

递归是经常会遇到的一种算法题型,那么如果都引入一个记忆数组db,就可以大大减少算法时间复杂度,也会减少栈溢出的风险。