202111-1更文-leetcode509:斐波那契数

425 阅读2分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

leetcode509-斐波那契数

前文

本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。

题目信息

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

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

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

解题思路分析

解法1

本解法主要是依据正常的递归思想进行解题。对于特殊的0和1,先进行单独的处理,使剩余项能否符合统一的递归公式。递归公式为每一项的斐波那契数,等于前两个斐波那契数的总和。因此要求目标斐波那契数,只需要得到前两项斐波那契数。而要求前两项斐波那契数,则只需要分别得到再两项的斐波那契数,并对其相加即可。因此递归可以直接对于目标数的n-1和n-2进行递归,分别计算斐波那契数。经过递归操作就会得到目标结果。

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

解法2

本解法是通过动态规划的思想,通过dp数组对于每一项的斐波那契数进行存储,所以直接可以从数组中得到斐波那契数。也就是说首先需要一个数组进行数据存储,将每个位置的斐波那契数存储在对应的数组中。而要求目标数组只需要直接获取目标位置的前两项数值。因此出于空间复杂度角度考虑,只需要用变量存储临近两项数值即可,不需要记录全部数组。而状态转移方程就是斐波那契数的定义,每一项等于前两项的和。

public int fib(int n) {
    if(n == 0){
        return 0;
    }else if(n == 1){
        return 1;
    }
    int a=0,b=1,c=1;
    for (int i = 2; i <= n; i++) {
        c = a + b;
        a = b;
        b = c;
    }
    return c;
}

复杂度分析

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。