LeetCode 1014题解析:最佳观光组合的O(n)解法

发布时间:2026/10/31 9:53:47

LeetCode 1014题解析:最佳观光组合的O(n)解法 1. 问题背景与题目解析这道题目来自LeetCode第1014题Best Sightseeing Pair属于数组类问题中的经典题型。题目描述如下给定一个正整数数组values其中values[i]表示第i个观光景点的评分。你需要选择两个景点i和ji j使得评分总和values[i] values[j] i - j达到最大值。这个评分公式可以理解为两个景点的原始评分之和减去它们之间的距离因为距离越远体验可能越差。举个例子假设values [8,1,5,2,6]那么最佳组合是values[0] values[3] 0 - 3 8 2 - 3 7。2. 暴力解法与复杂度分析最直观的解法是暴力枚举所有可能的(i,j)组合def maxScoreSightseeingPair(values): max_score 0 n len(values) for i in range(n): for j in range(i1, n): current values[i] values[j] i - j max_score max(max_score, current) return max_score这种方法的时间复杂度是O(n²)对于n50000的情况LeetCode的测试用例规模显然会超时。我们需要寻找更优的解法。3. 优化思路与数学变形观察评分公式values[i] values[j] i - j (values[i] i) (values[j] - j)我们可以将问题分解为对于每个j找到i j使得(values[i] i)最大。因为(values[j] - j)对于固定的j是常数所以整个问题转化为维护一个前缀最大值。具体步骤初始化max_prefix values[0] 0初始化max_score 0从j1开始遍历数组计算当前分数current_score max_prefix values[j] - j更新max_score更新max_prefix max(max_prefix, values[j] j)4. 最优解法实现基于上述思路我们可以写出O(n)时间复杂度的解法def maxScoreSightseeingPair(values): max_prefix values[0] 0 # values[i] i max_score 0 for j in range(1, len(values)): max_score max(max_score, max_prefix values[j] - j) max_prefix max(max_prefix, values[j] j) return max_score这个解法只需要一次遍历数组时间复杂度O(n)空间复杂度O(1)完美解决了大规模数据的问题。5. 算法正确性证明为什么这种方法有效关键在于我们维护的max_prefix。对于每个j我们需要的其实是前j-1个元素中(values[i] i)的最大值。通过动态维护这个最大值我们避免了重复计算。数学归纳法证明基础情况j1时max_prefix正确存储了values[0]0归纳假设假设对于jkmax_prefix正确归纳步骤对于jk1我们先用当前的max_prefix计算分数然后更新max_prefix为max(max_prefix, values[k]k)保证了对于jk2时max_prefix仍然正确6. 边界条件与测试用例需要考虑的特殊情况数组长度为2[8,1] → 8 1 0 - 1 8所有元素相同[7,7,7] → 7 7 0 - 1 13递减序列[9,8,7,6] → 9 8 0 - 1 16递增序列[1,2,3,4] → 1 4 0 - 3 2测试代码assert maxScoreSightseeingPair([8,1,5,2,6]) 11 assert maxScoreSightseeingPair([1,2]) 2 assert maxScoreSightseeingPair([7,7,7]) 137. 常见错误与调试技巧新手容易犯的错误初始化max_prefix为0而不是values[0]0从j0开始遍历导致ij的情况更新max_prefix的顺序错误应该先计算分数再更新调试技巧打印中间变量在循环中打印max_prefix和current_score使用小测试用例手动验证检查数组越界情况8. 算法优化与变种这个问题有几个有趣的变种如果要求i和j的距离不超过k可以使用滑动窗口维护最大值如果评分公式改为values[i] * values[j] i - j需要不同的数学变形如果要求找出所有达到最大值的对需要额外存储信息对于原问题还可以进一步优化代码def maxScoreSightseeingPair(values): max_score max_prefix 0 for j in range(len(values)): max_score max(max_score, max_prefix values[j] - j) max_prefix max(max_prefix, values[j] j) return max_score9. 实际应用场景这类问题在实际中有广泛应用旅游路线规划选择最佳的两个观光点股票交易选择买入和卖出时机考虑时间衰减广告投放选择最佳的两个广告位考虑位置影响理解这类问题的解法有助于解决其他类似的最优化问题。10. 刷题建议与学习路径对于LeetCode刷题的建议先尝试暴力解法理解问题本质寻找数学变形或规律考虑动态规划或贪心思路写出优化解法并验证总结类似问题的模式类似题目推荐Best Time to Buy and Sell StockMaximum SubarrayMaximum Product Subarray这个问题的关键在于将原始公式拆分为可独立优化的部分这种分而治之的思想在很多算法问题中都适用。
延伸阅读

更多相关文章

2026/10/31 9:48:46

Unity游戏开发中的压缩算法优化实践

1. 压缩算法概述与Unity集成背景 在游戏开发领域,资源压缩始终是性能优化的核心环节。Brotli、LZ4和LZ77系列算法作为当前主流的无损压缩方案,各自在压缩率、速度和内存占用上展现出独特优势。Unity引擎作为跨平台游戏开发的事实标准,其资源管…

2026/10/31 9:48:46

现代数据库技术演进与选型指南

1. 数据库技术演进与市场格局变迁 近两年全球数据库市场正经历着前所未有的变革。根据DB-Engines最新排名显示,传统商业数据库与开源解决方案的市场份额差距正在缩小,2023年PostgreSQL首次进入前三甲,MongoDB则连续18个月保持前五位置。这种格…

2026/10/31 9:48:46

链表节点删除:迭代与递归实现详解

1. 链表基础与问题定义链表是一种常见的基础数据结构,由一系列节点组成,每个节点包含数据域和指针域。在单链表中,每个节点指向下一个节点,而双链表则同时包含前驱和后继指针。我们今天要解决的问题是:给定一个链表头节…

2026/10/31 10:59:05

4款500万像素短波红外相机

500万像素级短波红外相机采用索尼IMX992 SenSWIR传感器,通过3.45μm微小像元实现约532万像素的高分辨率SWIR成像。凭借高分辨率与高灵敏度的优势,广泛应用于半导体晶圆检测、材料分选、激光束分析及科学实验成像等领域。 下面给出四款主流3.45m像元尺寸&…

2026/10/31 10:59:05

【Python毕业设计】Django+Vue+MySQL基于HTML5的旅游网站的设计与实现|旅游信息管理系统、景点管理与旅游攻略分享平台(功能演示+核心代码)【计算机毕业设计课程设计】

本系统以旅游信息展示和旅行经验分享为应用场景,采用 Python Django Vue MySQL 开发,覆盖前台用户端和后台管理端。用户端已实现用户注册登录、个人资料管理、景点分类与关键词查询、景点详情阅读、旅游攻略浏览与发布、收藏点赞评论、社区发帖与交流…

2026/10/31 10:59:05

暴晒 60℃不宕机!Remote ID模块高温长时实测记录

夏季露天试飞、厂区户外试验、野外测绘作业时,无人机机载设备长期暴晒,模块壳体温度轻松突破 60℃。高温极易造成 WiFi 掉线、4G 断上报、Web 后台卡死、RID 广播中断、地面站数据不同步等合规风险。 本次搭载 阿木实验室JCV600 无人机,在室…

2026/10/31 10:59:05

详细解析什么是原型开发

所谓原型开发, 就是在把完整的产品进行大规模正式研发动作以前, 先把那些关键的解决方案弄成一个能够让人去观察到外观、能够让人去进行操作练习或者能够得到相关测试结果的模型, 在处理涉及到页面布局和操作流程这些内容的时候, 可以提前用墨刀这个工具做出来的原型产品把整个…

2026/10/31 10:54:05

大麦自动抢票教程:从选城市到提交订单 7 步自动走完

大麦自动抢票教程:从选城市到提交订单 7 步自动走完 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 大麦开票就几秒钟,手动点…

2026/10/30 20:55:10

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/30 20:55:10

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/30 20:55:09

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/31 0:02:41

猫狗目标检测数据集:VOC/COCO/YOLO三格式一体化实战包

简介:本资源是一套面向计算机视觉初学者与YOLO目标检测实践者的猫狗图像数据集及配套开发工具包,专为快速上手目标检测模型训练而设计。资源包含1000张真实场景高清猫狗图片,标注质量高,同时提供VOC(XML)、…

2026/10/31 0:02:41

HDU2017多校标程复现:算法竞赛工程化真题沙盒

简介:本资源为2017年HDU多校联合训练第一场官方配套资料,面向ACM程序设计竞赛备赛学生、算法爱好者及高校编程集训队成员,旨在提供权威解题参考与完整测试验证环境。压缩包共40个文件,含15份C标程(覆盖全部赛题&#x…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑