LeetCode-Go 题解:1137. N-th Tribonacci Number(泰波那契数)滚动数组动态规划实现解析

发布时间:2026/9/12 18:19:46
LeetCode-Go 题解:1137. N-th Tribonacci Number(泰波那契数)滚动数组动态规划实现解析 LeetCode-Go 题解1137. N-th Tribonacci Number泰波那契数滚动数组动态规划实现解析【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go导读本文围绕 LeetCode 第 1137 题「N-th Tribonacci Number」展开以仓库 LeetCode-Go 中该题目的官方题解文档 leetcode/1137.N-th-Tribonacci-Number/README.md 为骨架结合仓库内的 Go 实现与单元测试进行纵深剖析。读者读完本文后将掌握泰波那契数列的递推定义、使用「滚动数组」将动态规划空间复杂度优化到 O(1) 的写法并能对照源码与测试用例完成本地验证。题目原文与递推定义题目要求实现函数tribonacci(n)返回泰波那契序列Tribonacci sequence的第 n 项 Tn。泰波那契序列与斐波那契Fibonacci最大的区别在于每一项由前三项之和递推得到而不是前两项之和。其完整定义如下边界条件T0 0T1 1T2 1递推关系Tn3 Tn Tn1 Tn2n 0等价地也可以写成面向实现的形态Tn Tn-1 Tn-2 Tn-3n 3示例Example 1Input: n 4 Output: 4 Explanation: T_3 0 1 1 2 T_4 1 1 2 4Example 2Input: n 25 Output: 1389537约束条件0 n 37答案保证是一个 32 位整数即answer 2^31 - 1从约束可以看出两个关键信息n 的上限为 37说明本仓库题解文档与实现针对的是题目给出的官方数据范围不做超出该范围的假设答案在 32 位整数范围内即使用 Go 的int类型即可安全承载无需使用int64或大数运算。由于递推中每一项约为前三项之和增长速度为约 O(1.84^n)泰波那契常数n37 时仍不溢出 32 位整数这正是题目保证answer 2^31 - 1的原因。解题思路滚动数组动态规划题解文档给出的思路是「求泰波那契数列中的第 n 个数。简单题按照题意定义计算即可。」所谓「按照题意定义计算」对应到代码层面就是自底向上的迭代递推维护三个变量分别代表当前项trib以及它的前两项prev、prev2每次迭代执行trib prev2 prev trib然后整体向右滚动一格prev2 prev、prev trib的旧值循环 n-2 次后trib即为 Tn。这种写法本质上是动态规划的「滚动数组」优化完整 DP 需要长度为 n1 的数组记录每一项但递推只依赖最近的三项因此可以用 3 个变量代替整个数组把空间复杂度从 O(n) 降到 O(1)。仓库源码实现逐行解析仓库中该题的实际实现位于 leetcode/1137.N-th-Tribonacci-Number/1137. N-th Tribonacci Number.go完整代码如下package leetcode func tribonacci(n int) int { if n 2 { return n } trib, prev, prev2 : 1, 1, 0 for n 2 { trib, prev, prev2 tribprevprev2, trib, prev n-- } return trib }下面逐段拆解其原理1. 边界条件处理if n 2 { return n }当 n 为 0 或 1 时直接返回 n 本身。结合定义 T0 0、T1 1这一句同时覆盖了两个边界情况非常简洁。注意它没有单独处理 n 2因为 n 2 时 T2 1 会由后面的循环逻辑正确得出。2. 初始化三指针trib, prev, prev2 : 1, 1, 0这里的三元组依次表示trib T2 1prev T1 1prev2 T0 0。三个变量的初始值恰好对应题目给出的三个边界项后续循环在此基础上向右滚动。3. 核心滚动循环for n 2 { trib, prev, prev2 tribprevprev2, trib, prev n-- } return trib这是整个算法的灵魂。Go 支持多重赋值右值会先全部求值完毕再统一赋值因此可以在一行内安全完成「计算新项 三个指针整体右移」新trib 旧trib prev prev2即 Tn Tn-1 Tn-2 Tn-3新prev 旧trib前一项变为当前项新prev2 旧prev前前项向前推进一位。由于 Go 多重赋值的求值顺序保证这一行不会出现传统单变量写法中「先覆盖再取旧值」的经典 bug。循环执行n - 2次后退出此时trib即为 Tn。4. 复杂度分析维度指标说明时间复杂度O(n)循环恰好执行 n-2 次每次 O(1) 加法空间复杂度O(1)只使用 3 个整型变量不随 n 增长相比递归解法指数级时间、O(n) 栈空间和朴素数组 DPO(n) 空间滚动数组写法在本题的数据范围n 37下是内存最省的迭代方案且逻辑直观、无栈溢出风险。测试用例验证仓库为该题配套了表驱动单元测试位于 leetcode/1137.N-th-Tribonacci-Number/1137. N-th Tribonacci Number_test.go。测试采用了本仓库统一的结构体模板type question1137 struct { para1137 ans1137 } type para1137 struct { one int } type ans1137 struct { one int }其中para1137表示输入参数即 nans1137表示期望输出即 Tn。测试用例覆盖了输入 n期望输出 Tn覆盖点11边界T1 121边界T2 132首次真正进入递推T3 T0T1T2 244题目 Example 1T4 T1T2T3 4251389537题目 Example 2较大 n 的正确性测试主体通过遍历用例并打印输入输出进行断言for _, q : range qs { _, p : q.ans1137, q.para1137 fmt.Printf(【input】:%v 【output】:%v\n, p, tribonacci(p.one)) }其中para1137{4}→ans1137{4}、para1137{25}→ans1137{1389537}分别与题解文档中的两个 Example 完全一致实现了「文档示例 ↔ 源码实现 ↔ 测试断言」三方互相印证。结合仓库 gotest.sh 中go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...的全量覆盖统计方式每个题解目录都要求对应的测试保证 100% 覆盖率本目录的两个文件恰好构成一个自洽的最小测试闭环。与斐波那契题解的同源对照泰波那契是斐波那契的「三项递推」推广二者在仓库中形成了很好的对照学习素材。斐波那契第 509 题的题解位于 leetcode/0509.Fibonacci-Number/509. Fibonacci Number.go该文件一口气给出了七种解法朴素递归O(2^n)仅用于理解递推本质自底向上记忆化搜索数组缓存O(n) 空间自顶向下记忆化搜索递归 map 缓存滚动数组 DP与 1137 题同思路O(1) 空间矩阵快速幂O(log n)通项公式法浮点运算涉及黄金分割协程并发版源码注释明确指出启动 goroutine 极慢仅作反面教材。对照阅读可以清晰看出当递推依赖的项数从 2 增加到 3 时滚动数组变量从 2 个增加到 3 个其余递推框架完全一致。1137 题选用最简的滚动数组解法正是「按照题意定义计算」的直译而 509 题的多解法清单则展示了同一类递推问题在不同场景下的优化阶梯时间换空间、矩阵幂换时间。本地运行与验证方式仓库使用 Go 1.19见 go.mod。在仓库根目录下可以单独运行本题的测试go test ./leetcode/1137.N-th-Tribonacci-Number/ -v -run Test_Problem1137也可以运行整个 leetcode 包的覆盖测试生成覆盖率报告go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...通过-v参数可以看到测试输出例如【input】:4 【output】:4 【input】:25 【output】:1389537输出与题解文档中的 Example 1、Example 2 完全吻合验证通过。小结本文完整覆盖了 题解文档 中的题目定义、两个示例与约束条件并在此基础上深挖了仓库的 Go 实现三个指针的滚动数组动态规划时间复杂度 O(n)、空间复杂度 O(1)同时结合表驱动测试用例与斐波那契姊妹题做了横向对照。掌握了这道题你就掌握了「k 项递推 滚动数组」这一类动态规划题目的通用套路——把依赖的 k 个历史状态压缩为 k 个变量即可用 O(n) 时间、O(1) 空间求解。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考