算法分析:斐波那契数列

前言

  • 这道题就是找出这个数列的第 n 个节点,而这个数列有个特地点就是第 n 个数字 = n-1 + n-2 两个数字之和,所以我们一般这种有两种解法,递归和迭代
  • 题目地址:https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof/
    在这里插入图片描述

第一种解法:迭代法

  • 看到这种一个数等于前两个数之和的题目,第一个想法就需要存储以前的数字,一般都是用数组
  • 第一步,创建一个数组
  • 第二步,给前两个数组复制0 和 1
  • 第三步,进行循环遍历,第 n 个数 = 第 n-1 个数 + 第 n-2 个数,然后存起来
  • 第四步,将数组下标为 n 的数字返回
  • 代码如下:
class Solution {
    public int fib(int n) {
        int[] ans = new int[105];
        ans[0] = 0;
        ans[1] = 1;
        if(n==0)
            return 0;
        if(n==1)
            return 1;
        for(int i=2;i<=n;i++){
            ans[i] = (ans[i-2] + ans[i-1])%1000000007;
        }
        return ans[n];
    }
}
  • 但是你想想,如果第 n 个数足够大,那岂不是要创建一个很大的数组,但是数组除了第 n-1 个数和第 n-2 个数是有用的,之前的都是没用的,所以我们使用双指针法
  • 使用两个指针分别指向第 n-1 个数和第 n-2 个数,然后每次循环就替换这两个指针
  • 代码如下:
class Solution {
    public int fib(int n) {
        if(n == 0){
            return 0;
        }
        if(n == 1){
            return 1;
        }
        int pre = 0;
        int cur = 1;
        int sum = 0;
        for(int i=2;i<=n;i++){
            sum = (pre + cur)%1000000007;
            pre = cur;
            cur = sum;
        }
        return sum;
    }
}

在这里插入图片描述

第二种方法:递归法

  • 虽然我觉得上面的方法足够简便,并且时间和空间都挺好,但是我还是要说这种递归算法,可能性能不如上面的,但是思想还是要学习一下
  • 先看下图,斐波那契数列给划分下来,就类似于树结构
    在这里插入图片描述
  • 所以我们递归也很简单就是下面的代码,将结果分散下去:
class Solution {
    public int fib(int n) {
        if(n == 0){
            return 0;
        }
        if(n == 1){
            return 1;
        }
        return fib(n-1) + fib(n-2);
    }
}
  • 但是这个代码还是有点不够好,因为我们做了很多的重复性操作,就如下图花了红圈的地方,我们可以用一个数组来保存,然后节省时间。
    在这里插入图片描述
class Solution {
    public static int[] cache = new int[101];

    public int fib(int n){
        if (0 == n || 1 == n)
            return n;
        if (0 != cache[n])
            return cache[n];
        cache[n] = (fib(n - 1) + fib(n - 2)) % 1000000007;

        return cache[n];
    }

}

在这里插入图片描述

总结

总体来说我还是更喜欢双指针的那种解法,因为更加简便,但是递归还是必学的,思想永远不会嫌多的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值