1137. 第 N 个泰波那契数

这篇博客介绍了如何解决LeetCode上的泰波那契数列问题,通过动态规划的方法实现记忆化搜索,有效计算第n个泰波那契数。代码实现简洁高效,适用于n小于等于37的情况。
2021-08-08 LeetCode每日一题

链接:https://leetcode-cn.com/problems/n-th-tribonacci-number/

标签:数学、记忆化搜索、动态规划

题目

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

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

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

示例 1:

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

示例 2:

输入:n = 25
输出:1389537

提示:

  • 0 <= n <= 37
  • 答案保证是一个 32 位整数,即 answer <= 2^31 - 1。

分析

(1)题目保证答案范围在[0, 2 ^ 31 - 1],所以使用int存储即可。

(2)和斐波那契数列一样,只不过这里是三个数之和。

编码

class Solution {
    public int tribonacci(int n) {
        if (n <= 2) {
            return n == 0 ? 0 : 1;
        }

        int t0 = 0, t1 = 1, t2 = 1, res = 0;
        while (n-- >= 3) {
            res = t0 + t1 + t2;
            t0 = t1;
            t1 = t2;
            t2 = res;
        }

        return res;
    }
}

请添加图片描述

<think>嗯,用户想找关于泰波数列用C语言实现的递推代码或者教程。首先,我需要回顾一下泰波数列定义。根据引用[2]和引用[3],泰波数列的前三项是T0=0,T1=1,T2=1,之后每一项都是前三项之和。这类似于斐波那契数列,但多了一个项。 用户可能已经了解斐波那契数列的递推方法,所以需要将这种知识迁移到泰波数列上。斐波那契数列通常用组来存储前两项,然后循环计算后面的项。而泰波数列则需要初始化三个初始,并在循环中每次累加前三个。 接下来,我需要检查用户提供的引用内容中的代码示例。引用[2]中的代码有一个错误,在循环中F[i] = F[i - 1] = F[i - 2] + F[i - 3]; 这显然不正确,应该是F[i] = F[i-1] + F[i-2] + F[i-3]。而引用[3]中的代码是正确的,正确初始化了前三项,并循环计算每一项。 因此,正确的代码应该像引用[3]中的示例那样,定义组,初始化前三项,然后从i=3开始循环到n,每次计算当前项为前三项之和。需要注意组的大小是否足够,比如当n较大时,组可能会越界。用户可能需要处理n较大的情况,但根据引用中的例子,可能暂时假设n不会超过组大小。 用户可能还需要了解代码的每个步骤,所以需要在解释时详细说明每个部分的作用,比如组的定义、初始化、循环结构以及返回结果。此外,还需要指出可能的错误点,比如组索引是否正确,循环起始点是否正确。 另外,用户可能想知道时间复杂度和空间复杂度。递推方法的时间复杂度是O(n),空间复杂度也是O(n),但如果使用变量代替组存储前三个,可以优化到O(1)空间复杂度。不过根据用户的需求,可能更关注递推实现,所以暂时提供组版本。 最后,生成相关问题需要考虑用户可能的后续疑问,比如优化方法、不同语言的实现、性能比较或者应用场景,这样可以帮助用户更深入地理解泰波数列实现和应用。</think>### 泰波数列的C语言递推实现 #### 一、泰波数列定义 泰波数列 $T_n$ 的定义如下: $$ \begin{cases} T(0) = 0, \\ T(1) = 1, \\ T(2) = 1, \\ T(n) = T(n-1) + T(n-2) + T(n-3) & (n \geq 3) \end{cases} $$ #### 二、递推实现思路 1. **初始化前三个**:根据定义设置 $T[0]=0$, $T[1]=1$, $T[2]=1$[^2][^3] 2. **循环计算后续项**:从 $i=3$ 开始,通过公式 $T[i] = T[i-1] + T[i-2] + T[i-3]$ 递推计算 3. **返回结果**:直接返回组的第 $n$ 项 #### 三、完C语言代码 ```c int tribonacci(int n) { int T[100]; // (1) 定义组存储结果 T[0] = 0; // (2) 初始化前三项 T[1] = 1; T[2] = 1; for(int i = 3; i <= n; ++i) { // (3) 递推计算后续项 T[i] = T[i-1] + T[i-2] + T[i-3]; // (4) 核心递推公式 } return T[n]; // (5) 返回结果 } ``` #### 四、代码解析 | 代码段 | 说明 | |-------|------| | `(1)` | 定义足够大的组(假设n≤99)| | `(2)` | 初始化前三个已知项 | | `(3)` | 从第4项开始循环计算 | | `(4)` | 递推公式实现相加 | | `(5)` | 返回目标项 | #### 五、时间复杂度分析 - **时间复杂度**:$O(n)$,仅需单层循环 - **空间复杂度**:$O(n)$,使用组存储结果[^3] #### 六、优化建议 1. **滚动变量法**:只需保存前三个,可将空间复杂度优化为 $O(1)$ 2. **边界处理**:增加对 $n<0$ 的输入校验 3. **动态组**:使用动态内存分配处理大情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值