问题描述
小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values 中,其中 values[i] 表示第 i 个观光景点的评分。同时,景点之间的距离由它们的下标差 j - i 表示。
一对景点 (i < j) 的观光组合得分为 values[i] + values[j] + i - j,也就是两者评分之和减去它们之间的距离。
小R想知道,在哪种情况下能够获得观光景点组合的最高得分。
测试样例
样例1:
输入:
values = [8, 3, 5, 5, 6]输出:11
样例2:
输入:
values = [10, 4, 8, 7]输出:16
样例3:
输入:
values = [1, 2, 3, 4, 5]输出:8
目的是找出给定景点评分数组 values 中,任意两个景点组合能够得到的最高得分。根据题目描述,任意两个景点 (i, j) 的组合得分计算公式为 values[i] + values[j] + i - j。这里的关键是要找到两个景点的组合,使得这个得分最大化。
思路:
-
边界条件处理:如果
values数组的长度小于或等于1,那么没有组合可言,直接返回0。 -
初始化变量:
maxScore用于存储当前找到的最高得分,初始值为 -1。max_i_plus_value用于存储values[i] + i的最大值,这个值在后续计算中会用到,初始值也为 -1。
-
遍历数组:
- 外层循环遍历数组
values的每个元素,用j表示当前遍历到的景点的索引。 - 如果
j大于0,说明不是第一个元素,可以与前面的元素形成组合,因此需要更新maxScore。更新的方式是取当前maxScore和max_i_plus_value + values[j] - j的较大值。这里的max_i_plus_value + values[j] - j实际上就是values[i] + values[j] + i - j的一种变形,其中i是使得values[i] + i最大的那个索引。 - 在每次循环中,都需要更新
max_i_plus_value,使其为当前max_i_plus_value和values[j] + j的较大值。
- 外层循环遍历数组
-
返回结果:遍历结束后,
maxScore中存储的就是能够得到的最高得分,返回这个值。
代码的核心在于通过动态更新 max_i_plus_value 来找到 values[i] + i 的最大值,并用它来计算可能的最高得分。这种方法的时间复杂度是 O(n),其中 n 是数组 values 的长度,因为只需要遍历一次数组。
代码
def solution(values: list) -> int:
if len(values) <= 1:
return 0
maxScore = -1
max_i_plus_value = -1 # 用于存储 values[i] + i 的最大值
for j in range(len(values)):
if j > 0:
maxScore = max(maxScore, max_i_plus_value + values[j] - j)
max_i_plus_value = max(max_i_plus_value, values[j] + j)
return maxScore # Placeholder return