news 2026/5/12 12:21:19

Leetcode 79 最佳观光组合

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Leetcode 79 最佳观光组合

1 题目

1014. 最佳观光组合

给你一个正整数数组values,其中values[i]表示第i个观光景点的评分,并且两个景点ij之间的距离j - i

一对景点(i < j)组成的观光组合的得分为values[i] + values[j] + i - j,也就是景点的评分之和减去它们两者之间的距离。

返回一对观光景点能取得的最高分。

示例 1:

输入:values = [8,1,5,2,6]输出:11解释:i = 0, j = 2, values[i] + values[j] + i - j = 8 + 5 + 0 - 2 = 11

示例 2:

输入:values = [1,2]输出:2

2 代码实现

class Solution { public: int maxScoreSightseeingPair(vector<int>& values) { int best = values[0]; int ans = 0; for (int j = 1 ; j < values.size() ; j++){ ans = max (ans, best + values[j] - j ); best = max(best , values[j] + j ); } return ans; } };

题解

思路一句话版

把公式

values[i] + values[j] + i - j

拆成

(values[i] + i) + (values[j] - j)

遍历j的时候,只需要维护j 左边最大的values[i] + i

C++ 代码(推荐写法)

#include <vector> #include <algorithm> using namespace std; class Solution { public: int maxScoreSightseeingPair(vector<int>& values) { int best = values[0]; // 当前最大的 values[i] + i int ans = 0; for (int j = 1; j < values.size(); j++) { // 用当前 best 和 j 计算得分 ans = max(ans, best + values[j] - j); // 更新 best,供后面的 j 使用 best = max(best, values[j] + j); } return ans; } };

为什么是 O(n)?

  • 每个元素只遍历一次

  • 只用了两个变量

  • 时间复杂度:O(n)

  • 空间复杂度:O(1)


再帮你对比一下暴力解法(为什么不行)

暴力写法(会超时)
for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { ans = max(ans, values[i] + values[j] + i - j); } }
  • 时间复杂度:O(n²)

  • n 最大到 5 万,直接炸 💥


记忆口诀(刷题用)

i 在左,j 在右
i 的最大值提前存
j 来了直接算

详解这段代码中循环里计算得分和更新best的逻辑

首先,我们先明确这道题的核心公式:对于观光配对(i, j)(要求i < j),得分是values[i] + values[j] + i - j。我们可以把这个公式拆分成两部分:

  • 第一部分:values[i] + i(只和i有关)
  • 第二部分:values[j] - j(只和j有关)

所以得分就等价于(values[i] + i) + (values[j] - j)i < j)。

代码逻辑逐行解释

class Solution { public: int maxScoreSightseeingPair(vector<int>& values) { int best = values[0]; // 初始化为 values[0] + 0(因为i=0时,values[i]+i就是values[0]+0) int ans = 0; for (int j = 1; j < values.size(); j++) { // 第一步:用当前找到的最优i(对应best=values[i]+i)和当前j计算得分 // 得分 = (values[i]+i) + (values[j]-j) = best + values[j] - j ans = max(ans, best + values[j] - j); // 第二步:更新best,把当前j当作新的i候选(因为后面的j' > j,此时j就是i) // 新的候选值是 values[j] + j,和原来的best比,保留更大的那个 best = max(best, values[j] + j); } return ans; } };

举个例子帮你理解

假设values = [8,1,5,2,6],我们一步步走一遍:

  1. 初始化:best = 8 + 0 = 8ans = 0
  2. j=1(values[j]=1):
    • 得分:8 + 1 - 1 = 8ans = 8
    • 更新 best:max(8, 1+1=2)best=8
  3. j=2(values[j]=5):
    • 得分:8 + 5 - 2 = 11ans = 11
    • 更新 best:max(8, 5+2=7)best=8
  4. j=3(values[j]=2):
    • 得分:8 + 2 - 3 = 7ans还是 11
    • 更新 best:max(8, 2+3=5)best=8
  5. j=4(values[j]=6):
    • 得分:8 + 6 - 4 = 10ans还是 11
    • 更新 best:max(8, 6+4=10)best=10
  6. 最终返回ans=11(对应 i=0,j=2 的配对,得分 8+5+0-2=11,和计算结果一致)

总结

  1. 公式拆分是核心:将原得分公式values[i]+values[j]+i-j拆分为(values[i]+i) + (values[j]-j),把双变量问题转化为单变量的遍历问题。
  2. 贪心维护最优值:遍历j时,用best维护之前所有i < jvalues[i]+i的最大值,这样每一步只需要 O (1) 计算,整体时间复杂度是 O (n)。
  3. 遍历顺序:因为要求i < j,所以从j=1开始遍历,先计算当前j的得分,再更新best(避免 j 自己和自己配对)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 9:17:18

Orleans分布式追踪方案深度评测:从架构设计到生产实践

Orleans分布式追踪方案深度评测&#xff1a;从架构设计到生产实践 【免费下载链接】orleans dotnet/orleans: Orleans是由微软研究团队创建的面向云应用和服务的分布式计算框架&#xff0c;特别适合构建虚拟 actor模型的服务端应用。Orleans通过管理actors生命周期和透明地处理…

作者头像 李华
网站建设 2026/5/12 6:40:40

Delta Force Beta 发布

Delta Force Beta阶段发布 一、对全世界&#xff1a;我们吹的牛实现了 Git仓库&#xff08;高质量的软件工程&#xff09;&#xff1a;https://github.com/likeUMR/DeltaForce_Loot_Master B站&#xff1a;https://www.bilibili.com/video/BV1gyq3BkEVv/?share_sourcecopy_…

作者头像 李华
网站建设 2026/5/3 14:53:42

comsol仿真模拟反应器底部加热进行化学反应,生成氨气NH3的模拟,流场+流体传热+固体传热...

comsol仿真模拟反应器底部加热进行化学反应&#xff0c;生成氨气NH3的模拟&#xff0c;流场流体传热固体传热浓物质传递4个物理场耦合。在化工反应器模拟中&#xff0c;多物理场耦合就像在厨房同时操控燃气灶、抽油烟机和计时器。最近用COMSOL折腾了一个底部加热合成氨的反应器…

作者头像 李华
网站建设 2026/5/1 20:40:44

基于Matlab分析弧齿锥齿轮啮合轨迹及传递误差

基于matlab的用于分析弧齿锥齿轮啮合轨迹的程序&#xff0c;输出齿轮啮合轨迹及传递误差。 程序已调通&#xff0c;可直接运行。程序保证可直接运行。在机械传动领域&#xff0c;弧齿锥齿轮的啮合特性分析至关重要。今天就来跟大家分享一下我基于Matlab开发的用于分析弧齿锥齿轮…

作者头像 李华
网站建设 2026/5/12 4:23:20

基于贝叶斯方法的稀疏表示学习(MATLAB R2018)实践漫谈

基于贝叶斯方法的稀疏表示学习&#xff08;MATLAB R2018&#xff09; figure; subplot(2,1,1);plot(x); axis([x_range,y_range]); title(Original Signal); subplot(2,1,2);plot(m); axis([x_range,y_range]); title(Recovery Signal);在信号处理与机器学习领域&#xff0c;基…

作者头像 李华
网站建设 2026/4/22 6:03:15

Bark模型完整指南:从零开始掌握文本转语音技术

Bark模型完整指南&#xff1a;从零开始掌握文本转语音技术 【免费下载链接】bark 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/bark 快速入门 Bark是由Suno开发的革命性文本到音频生成模型&#xff0c;它不仅能生成高度逼真的多语言语音&#xff0c;还能…

作者头像 李华