要解决这个问题,我们需要找到一对景点 (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),因为我们只使用了常数个额外变量。
通过这种方法,我们可以高效地找到观光景点组合的最高得分。