最佳观光组合-LeetCode
1014. 最佳观光组合
🎯 问题描述
描述:
给你一个正整数数组 values,其中 values[i] 表示第 i 个观光景点的评分。
两个景点 i 和 j(i < j)组成的观光组合的得分为:
即:两个景点的评分之和减去它们之间的距离。
请你返回一对观光景点能取得的最高分。
说明:
-
这是一个线性扫描结合拆分项维护的问题。
-
直接暴力枚举所有 对需要 时间。
-
核心优化逻辑:将公式拆分为 。
-
当我们遍历到 时,只需要知道在 之前, 的最大值是多少。
-
示例:
-
示例 1:
1 | 输入:values = [8,1,5,2,6] |
💻 解题思路
思路1:一次遍历 + 维护最大值
思路1:代码实现
1 | class Solution: |
思路1:📊 性能分析
- 时间复杂度:
- 其中 是
values的长度。 - 只需要遍历数组一次。
- 其中 是
- 空间复杂度:
- 只使用了常数个变量 (
rating,rate_i,ans)。
- 只使用了常数个变量 (
思考
-
公式拆分(核心技巧):
- 原公式:
- 变形:
- 对于固定的 ,要使 最大,我们需要在 的范围内找到最大的 。
-
变量含义:
rate_i:在代码中,这个变量维护的是当前下标j之前所有位置中, 的最大值。- 虽然变量名叫
rate_i,但它实际上存储的是 。
-
遍历过程模拟:
- 当循环进行到
j时:rate_j是当前值values[j]。rate_j - j是当前作为右端点的贡献值。rate_i是之前所有点作为左端点的最大贡献值。- 两者相加即为以
j为右端点的最佳组合分。
- 循环结束前:
- 我们需要把当前的
j纳入“历史最大值”的考量,因为对于未来的j+1来说,当前的j就是一个合法的i。 - 所以执行
rate_i = max(rate_i, rate_j + j)。
- 我们需要把当前的
- 当循环进行到
-
初始值:
rate_i初始化为 0 是安全的,因为题目中values是正整数,且 。- 实际上,在 时,由于没有 ,
rate_i还没起作用。 - 在 时,
rate_i已经被 更新为values[0] + 0。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






