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

81 阅读1分钟

要解决这个问题,我们需要找到一对景点 (i, j),使得观光组合得分 values[i] + values[j] + i - j 最大化。我们可以通过以下步骤来实现:

解题思路

1. 公式重构:

  • 目标是最大化 values[i] + values[j] + i - j。

  • 这可以重写为 (values[i] + i) + (values[j] - j)。

  • 因此,我们需要在遍历数组时,找到最大化 values[i] + i 和 values[j] - j 的组合。

2. 遍历数组:

  • 我们可以通过一次遍历来计算最大得分。

  • 在遍历过程中,维护一个变量 max_i,表示当前为止最大的 values[i] + i。

  • 对于每个 j,计算 values[j] - j,并更新最大得分为 max_i + values[j] - j。

  • 同时更新 max_i 为 max(max_i, values[j] + j)。

  • 实现步骤:

  • 初始化 max_score 为负无穷大,max_i 为 values[0] + 0。

  • 从第二个元素开始遍历数组,更新 max_score 和 max_i。

代码实现

def max_score_sightseeing_pair(values):
    # 初始化最大得分和 max_i
    max_score = float('-inf')
    max_i = values[0] + 0
    
    # 从第二个元素开始遍历
    for j in range(1, len(values)):
        # 更新最大得分
        max_score = max(max_score, max_i + values[j] - j)
        # 更新 max_i
        max_i = max(max_i, values[j] + j)
    
    return max_score

# 测试样例
print(max_score_sightseeing_pair([8, 3, 5, 5, 6]))  # 输出:11
print(max_score_sightseeing_pair([10, 4, 8, 7]))    # 输出:16
print(max_score_sightseeing_pair([1, 2, 3, 4, 5]))  # 输出:8

复杂度分析

  • 时间复杂度:𝑂(𝑛)O(n),因为我们只需遍历数组一次。

  • 空间复杂度:𝑂(1)O(1),因为我们只使用了常数个额外变量。

通过这种方法,我们可以高效地找到观光景点组合的最高得分。