202111-2更文-leetcode1137:第n个泰波那契数

236 阅读2分钟

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

leetcode1137:第n个泰波那契数

前文

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

题目信息

泰波那契序列 Tn 定义如下: 

T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2

给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

输入: n = 4
输出: 4
解释:
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4

解题思路分析

解法1

首先我们要了解一下什么是泰波那契数。根据题目描述可以判断出,所谓的泰波那契数,也就是每一个节点的值,等于该节点向前三个节点值的总和。而题目中已经定义,开始的三个节点,数值分别为0,1,1。因此可以轻易推断出,第四节点值为2,第五节点值为4。而想要知道第n个节点的值,只需要先计算n-1,n-2,n-3三个节点的值,然后计算三个节点的总和即可得到第n个节点的值。其中很容易的想法是通过递归操作。而本方案不采用递归的方式,选择采用动态规划的思路进行处理。考虑到动态规划,则需要一个dp数组,数组内存储的内容则为每个节点的数值即可。此处后续进行了优化,暂时不谈。另外要对于初始三个特殊节点的值进行指定。而对于状态转移方程,则直接采用题目的定义即可,第n个节点值等于之前三个节点值的总和。到此,题目本身已经解题完毕。而考虑到实际只要第n个节点,则可以将dp数组修改为之前三个节点的值循环利用,即可对空间复杂度进行优化。至此,题目解题完毕。

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

复杂度分析

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

后记

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