来~做下这道题:观光景点组合得分问题

72 阅读2分钟

【算法刷题】观光景点组合得分问题.png

问题描述

小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values 中,其中 values[i] 表示第 i 个观光景点的评分。同时,景点之间的距离由它们的下标差 j - i 表示。

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

小R想知道,在哪种情况下能够获得观光景点组合的最高得分。

约束条件:

  • 2 <= values.length
  • 1 <= values[i] <= 1000

测试样例

样例1:

输入:values = [8, 3, 5, 5, 6]
输出:11

样例2:

输入:values = [10, 4, 8, 7]
输出:16

样例3:

输入:values = [1, 2, 3, 4, 5]
输出:8

解题思路

  1. 公式分解

    • 公式 values[i] + values[j] + i - j 可以分解为 (values[i] + i) + (values[j] - j)
    • 这意味着我们可以分别计算 values[i] + i 和 values[j] - j,然后找到使得两者之和最大的组合。
  2. 优化思路

    • 我们可以遍历数组,同时维护一个变量来记录当前最大的 values[i] + i
    • 对于每个 j,我们计算 values[j] - j 并与当前最大的 values[i] + i 相加,更新最大得分。

完整代码示例-python

def solution(values: list) -> int:
    # 初始化最大得分
    max_score = float('-inf')
    
    # 初始化当前最大的 values[i] + i
    max_i_plus_value = float('-inf')
    
    # 遍历数组
    for j in range(len(values)):
        # 计算 values[j] - j
        j_minus_value = values[j] - j
        
        # 更新最大得分
        max_score = max(max_score, max_i_plus_value + j_minus_value)
        
        # 更新当前最大的 values[i] + i
        max_i_plus_value = max(max_i_plus_value, values[j] + j)
    
    return max_score

if __name__ == '__main__':
    print(solution(values=[8, 3, 5, 5, 6]) == 11)
    print(solution(values=[10, 4, 8, 7]) == 16)
    print(solution(values=[1, 2, 3, 4, 5]) == 8)


关键步骤解释

  1. 初始化

    • max_score 用于记录当前找到的最大得分。
    • max_i_plus_value 用于记录当前最大的 values[i] + i
  2. 遍历数组

    • 对于每个 j,计算 values[j] - j
    • 更新 max_score,即当前的 max_i_plus_value 加上 values[j] - j
    • 更新 max_i_plus_value,即当前的 values[j] + j

通过这种方式,可以在一次遍历中找到最大得分,时间复杂度为 O(n)