11.观光景点组合得分问题 | 豆包MarsCode AI刷题

96 阅读2分钟

问题描述

小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。这里的关键是要找到两个景点的组合,使得这个得分最大化。

思路:

  1. 边界条件处理:如果 values 数组的长度小于或等于1,那么没有组合可言,直接返回0。

  2. 初始化变量

    • maxScore 用于存储当前找到的最高得分,初始值为 -1。
    • max_i_plus_value 用于存储 values[i] + i 的最大值,这个值在后续计算中会用到,初始值也为 -1。
  3. 遍历数组

    • 外层循环遍历数组 values 的每个元素,用 j 表示当前遍历到的景点的索引。
    • 如果 j 大于0,说明不是第一个元素,可以与前面的元素形成组合,因此需要更新 maxScore。更新的方式是取当前 maxScoremax_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_valuevalues[j] + j 的较大值。
  4. 返回结果:遍历结束后,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