LeetCode 873 最长的斐波那契子序列的长度:集合枚举与动态规划双解法剖析
LeetCode 873 最长的斐波那契子序列的长度集合枚举与动态规划双解法剖析【免费下载链接】leetcodeLeetCode Solutions: A Record of My Problem Solving Journey.( leetcode题解记录自己的leetcode解题之路。)项目地址: https://gitcode.com/gh_mirrors/le/leetcode导读本文以 LeetCode 873「最长的斐波那契子序列的长度」为案例完整解析如何在一个严格递增的正整数数组中找出满足X_i X_{i1} X_{i2}的最长斐波那契式子序列。文章以仓库中 problems/873.length-of-longest-fibonacci-subsequence.md 的解题思路为主线从题目定义、集合枚举法、代码实现到复杂度分析层层展开并结合本仓库的 动态规划专题 梳理最优子结构与无后效性等前置概念。读完本文你将掌握「枚举两两起点 集合查表延伸」这一 O(n²log) 解法并理解如何借助哈希索引将时间复杂度进一步优化到 O(n²)。题目定义与样例分析斐波那契式的定义如果序列X_1, X_2, ..., X_n满足下列条件就说它是斐波那契式的n 3 对于所有 i 2 n都有 X_i X_{i1} X_{i2}题目给定一个严格递增的正整数数组 A要求找到 A 中最长的斐波那契式子序列的长度如果不存在返回0。子序列是从原序列 A 中派生出来的从 A 中删掉任意数量的元素也可以不删而不改变其余元素的顺序。例如[3, 5, 8]是[3, 4, 5, 6, 7, 8]的一个子序列。注意三个关键约束子序列不要求连续只要求保持相对顺序数组严格递增且均为正整数这保证了斐波那契式序列在数组内的唯一延伸方向3 A.length 10001 A[0] A[1] ... A[A.length - 1] 10^9。示例拆解示例 1输入: [1,2,3,4,5,6,7,8] 输出: 5 解释: 最长的斐波那契式子序列为[1,2,3,5,8]从1, 2出发延伸为1, 2, 3, 5, 8长度为 5注意数组虽然包含4和6、7但子序列1,2,3,5,8跳过了它们恰好印证了「子序列不要求连续」。示例 2输入: [1,3,7,11,12,14,18] 输出: 3 解释: 最长的斐波那契式子序列有[1,11,12][3,11,14] 以及 [7,11,18]本题只要求长度不要求输出具体序列因此即使存在多个长度为 3 的候选答案也只需返回3。前置知识动态规划原文档将本题归类为动态规划DP专题本仓库的 thinkings/dynamic-programming.md 系统梳理了动态规划的两个核心概念它们是理解本题思路的基础最优子结构如果问题的最优解所包含的子问题的解也是最优的就称该问题具有最优子结构性质。它决定了具体如何解决问题无后效性子问题的解一旦确定就不再改变不受其后更大问题的求解决策影响。它决定了是否可以使用动态规划来解决。此外动态规划的三个要素是状态定义用f(n)等函数描述问题、状态转移方程s[k] choice(s[k]) - s[k1]的阶段间转移关系、枚举状态一维状态用一层循环、二维状态用两层循环且保证不重不漏。原文档特别说明「和一般的 DP 不同这道题是已知状态转移方程。所以我勉强也归类到 DP 吧。」也就是说本题的特殊之处在于转移规则由斐波那契性质直接给出下一项 前两项之和真正需要设计的只是如何高效地枚举起点并验证延伸。核心思路枚举两两起点 集合延伸思路推导题目给出的斐波那契性质本身就是最天然的状态转移规则只要确定了一个序列的前两个元素 a 和 b那么第三项、第四项……就都被唯一决定了a, b - a b - a 2b - 2a 3b - ...因此解题思路可以拆成三步两两枚举数组中的数字作为斐波那契序列的起点 a 和 b注意 a 必须在 b 之前保证子序列顺序延伸验证斐波那契数列的下一项是a b题目给出的信息如果a b不在数组中直接终止本轮延伸继续枚举下一组起点如果a b在数组中说明找到了一个长度为 3 的斐波那契子序列继续尝试扩展到长度 4、5……记录最大长度整个枚举过程记录最大长度并返回若最大值小于 3 则返回 0。复杂度预估枚举两两组合需要O(n²)的时间复杂度对于每次枚举都需要不断检查a b是否在数组中直到不再数组中为止。最坏情况是始终在数组中此时延伸步数约为数组中最大值与最小值之差的对数即log(m1 - m2)其中m1为数组最大值m2为数组最小值。这个对数级别的延伸次数来源于斐波那契数列的指数增长速度值域上限为10^9而斐波那契数列增长极快约每 5 项翻 10 倍因此在值域内能延伸的项数非常有限。关键点用集合实现 O(1) 查表本解法的核心优化在于使用集合Set存储数组中的所有数然后枚举数组中的两两组合并在集合中不断延伸斐波那契数列。如果不使用集合每次判断a b是否在数组中需要遍历数组会导致总复杂度退化到接近O(n³)。而 Python 的set基于哈希表实现单次成员判断的时间复杂度为 O(1)从而把「延伸验证」这一步的开销压到最低这是整个算法能够以O(n²log(m1-m2))运行的基石。代码实现Python3原文档给出了完整的 Python3 实现这里在保留原逻辑的基础上补充注释便于逐行理解class Solution: def lenLongestFibSubseq(self, A: List[int]) - int: s set(A) # 关键点用集合存储所有数实现 O(1) 的成员查询 ans 0 # 记录全局最长的斐波那契式子序列长度 for i in range(len(A)): # 枚举第一个元素 A[i] for j in range(i 1, len(A)): # 枚举第二个元素 A[j]必须排在 i 之后 a, b A[j], A[i] A[j] # a 为当前序列最后一项b 为下一项 t 2 # 当前序列已有 a前两项之一和它的下一项 b while b in s: # 若下一项存在于数组中继续延伸 a, b b, a b # 序列整体后移一项 t 1 # 长度 1 ans max(ans, t) # 更新全局最大长度 return 0 if ans 3 else ans # 长度不足 3 说明不存在返回 0对代码的几点说明起点顺序保证内层循环从i 1开始天然保证了A[i]出现在A[j]之前符合子序列对顺序的要求延伸终止条件while b in s一旦遇到不在数组中的值立即停止避免无意义的空转结果判定斐波那契式子序列要求n 3因此当最大长度小于 3 时返回0这与题目描述完全一致类型标注List[int]需要从typing导入如from typing import List在线评测环境通常已预置。复杂度分析令n为数组长度m1为数组最大值m2为数组最小值时间复杂度O(n²log(m1-m2))。外层两重循环负责枚举两两组合O(n²)内层while循环负责延伸每次延伸查询集合 O(1)延伸次数上界为log(m1 - m2)空间复杂度O(n)。集合s存储了数组的全部 n 个元素。题目的提示还特别注明对于 Java、C、C 以及 C# 的提交时间限制被减少了 50%说明本题对常数因子较为敏感选用集合做哈希查询是实现层面的关键。扩展时间复杂度更优的哈希索引解法原文档指出「这道题还有时间复杂度更好的做法」即把时间复杂度进一步优化到O(n²)。其核心思想是把「两两枚举 集合延伸」改为二维动态规划 值到索引的哈希映射状态定义设dp[j][k]表示以A[j]、A[k]j k作为最后两项的斐波那契式子序列的最大长度状态转移若A[k] - A[j]即前一项存在于数组中且其索引i j则dp[j][k] dp[i][j] 1其中dp[i][j]是以A[i]、A[j]结尾的最长斐波那契式子序列长度初始条件任何两项都可以构成长度为 2 的「种子」即dp[j][k] 2哈希加速预先建立「数值 - 索引」的字典使A[k] - A[j]的查找达到 O(1)从而整体复杂度为O(n²)。这种方法不再依赖值域上的对数延伸步数而是把问题完全转化为二维 DP配合哈希表将单次转移降为 O(1)。它与 thinkings/dynamic-programming.md 中「两个序列的 DP 通常定义dp[i][j]表示以 i、j 结尾的状态」的套路一脉相承可以作为掌握二维状态定义的良好练习。小结LeetCode 873「最长的斐波那契子序列的长度」是一道「转移方程已知、枚举是难点」的动态规划题其价值体现在三个层面思路层面只要确定前两项整个斐波那契式序列就被唯一锁定这启发我们善于利用题目给出的递推性质压缩状态工程层面用哈希集合把「值是否存在」的查询从 O(n) 降到 O(1)是许多序列延伸类题目的通用优化手段进阶层面从「集合枚举」到「二维 DP 哈希索引」展示了同一道题在时间复杂度上的优化路径。本题在仓库中的完整题解位于 problems/873.length-of-longest-fibonacci-subsequence.md并收录于仓库的题目索引 README.md 与 SUMMARY.md 中。若希望进一步夯实动态规划功底可继续研读仓库的 thinkings/dynamic-programming.md其中对最优子结构、无后效性、状态转移方程与状态枚举方式有系统而深入的讲解。【免费下载链接】leetcodeLeetCode Solutions: A Record of My Problem Solving Journey.( leetcode题解记录自己的leetcode解题之路。)项目地址: https://gitcode.com/gh_mirrors/le/leetcode创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

5G SDAP协议详解:QoS流到DRB映射与反射映射机制

5G SDAP协议详解:QoS流到DRB映射与反射映射机制

简介:SDAP(Service Data Adaptation Protocol)是第五代移动通信新空口(5G NR)系统中的关键协议,负责服务数据的自适应处理,以及QoS流到数据无线承载(DRB)的映射。文档内容…

2026/9/19 2:03:39 阅读更多 →
ValidX集成Maven/Gradle完整指南:从仓库配置到依赖排查

ValidX集成Maven/Gradle完整指南:从仓库配置到依赖排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 2:03:39 阅读更多 →
Navicat Premium 15 SQLite深度实践指南

Navicat Premium 15 SQLite深度实践指南

1. 项目概述:为什么一个数据库图形化工具值得花时间吃透?Navicat Premium 15不是那种装上点几下就能扔在角落吃灰的软件。它是我过去三年里每天打开频率最高的三款桌面应用之一,和VS Code、Chrome并列。很多人把它当成“高级版的DB Browser f…

2026/9/19 2:03:39 阅读更多 →

最新新闻

I2C多主模式总线控制权切换:仲裁机制与实战避坑

I2C多主模式总线控制权切换:仲裁机制与实战避坑

前阵子调一块双MCU通信板,两个MCU都挂在同一条I2C总线上,原本想的是“谁有空谁发起读写”,结果跑起来后时不时丢数据、卡总线。用逻辑分析仪抓波形,才发现问题根本不在驱动代码,而是我没把I2C多主模式的总线控制权切换…

2026/9/19 2:53:05 阅读更多 →
DirectX修复工具增强版深度解析:组件覆盖、修复策略与实战排查

DirectX修复工具增强版深度解析:组件覆盖、修复策略与实战排查

1. 从一次游戏闪退说起:DirectX修复工具到底在修什么很多人第一次接触DirectX修复工具,都是被一个具体的报错逼到墙角的。比如兴冲冲装好一款游戏,双击图标,屏幕一黑,弹出一行字:“DirectX 12 is not suppo…

2026/9/19 2:53:05 阅读更多 →
401 报错 WorkBuddy 时,TaoToken 的 Key 怎么换

401 报错 WorkBuddy 时,TaoToken 的 Key 怎么换

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 2:53:05 阅读更多 →
Textual 样式示例集:用 textual run 快速运行、验证与学习 Textual CSS

Textual 样式示例集:用 textual run 快速运行、验证与学习 Textual CSS

Textual 样式示例集:用 textual run 快速运行、验证与学习 Textual CSS 【免费下载链接】textual The lean application framework for Python. Build sophisticated user interfaces with a simple Python API. Run your apps in the terminal and a web browser. …

2026/9/19 2:53:05 阅读更多 →
AMEsim电机驱动库建模指南:PMSM驱动系统仿真与PI参数整定

AMEsim电机驱动库建模指南:PMSM驱动系统仿真与PI参数整定

简介:AMESim电机驱动库是面向电机驱动系统仿真与设计的一份技术文档,适合从事电机驱动研发、控制系统验证的工程师及高校相关专业学生阅读。文档系统介绍了LMS IMAGINE S.A.开发的Electric Motors and Drives Library(Rev 9, 2009&#xff09…

2026/9/19 2:53:05 阅读更多 →
搞定wordpress跳出循环难题,源码下载避坑指南

搞定wordpress跳出循环难题,源码下载避坑指南

搞定wordpress跳出循环难题,源码下载避坑指南 域名解析指向不对,服务器端口没开对,这俩坑能把人逼疯。很多刚接手网站的朋友,一看到 WordPress…

2026/9/19 2:52:40 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/16 19:03:19 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/17 7:57:36 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/17 10:19:14 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →