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

45 阅读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

问题理解

我们需要找到一对景点 (i, j) 使得 values[i] + values[j] + i - j 的值最大,其中 i < j

数据结构选择

我们可以使用一个变量来记录当前的最大得分,并在遍历数组时更新这个变量。

算法步骤

  1. 初始化变量

    • max_score 用于记录当前的最大得分,初始值可以设为负无穷大。
    • max_i_value 用于记录当前 i 位置的最大 values[i] + i 值。
  2. 遍历数组

    • 对于每个位置 j,计算 values[j] - j 并与 max_i_value 相加,得到当前的得分。
    • 更新 max_score 如果当前得分更大。
    • 更新 max_i_value 如果 values[j] + j 更大。
  3. 返回结果

    • 遍历结束后,max_score 即为所求的最大得分。

总结

通过上述步骤,我们可以在一次遍历中找到最大得分,时间复杂度为 O(n),空间复杂度为 O(1)。由此我们可以得出完整答案

完整答案

def solution(values: list) -> int:
    n = len(values)
    if n < 2:
        return 0  # 如果数组长度小于2,无法形成组合,返回0或其他适当值
    
    # 初始化
    max_i_plus_values = values[0] + 0  # 初始时i=0
    max_score = values[0] + values[1] + 0 - 1  # 初始组合 (0,1)
    
    # 从第二个元素开始遍历
    for j in range(1, n):
        # 计算当前j的values[j] - j
        current = values[j] - j
        
        # 更新最大组合得分
        max_score = max(max_score, max_i_plus_values + current)
        
        # 更新max_i_plus_values
        max_i_plus_values = max(max_i_plus_values, values[j] + j)
    
    return max_score
 
if __name__ == '__main__':
    # 测试样例1
    print(solution(values=[8, 3, 5, 5, 6]) == 11)  # 输出: True
    
    # 测试样例2
    print(solution(values=[10, 4, 8, 7]) == 16)    # 输出: True
    
    # 测试样例3
    print(solution(values=[1, 2, 3, 4, 5]) == 8)  # 输出: True