问题描述
小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values 中,其中 values[i] 表示第 i 个观光景点的评分。同时,景点之间的距离由它们的下标差 j - i 表示。
一对景点 (i < j) 的观光组合得分为 values[i] + values[j] + i - j,也就是两者评分之和减去它们之间的距离。
小R想知道,在哪种情况下能够获得观光景点组合的最高得分。
思路:
- 我们可以使用两层循环来枚举所有可能的景点组合
(i, j),其中i < j。 - 对于每个组合,计算其观光组合得分
values[i] + values[j] + i - j。 - 记录最大的得分及其对应的
i和j。
解释:
-
max_score = float('-inf'):将最大得分初始化为负无穷,确保可以更新为更高的得分。 -
两层
for循环:for i in range(len(values)):外层循环遍历i的位置。for j in range(i + 1, len(values)):内层循环遍历j的位置,且j > i。
-
score = values[i] + values[j] + i - j:计算观光组合得分。 -
if score > max_score:如果当前得分大于最大得分,更新最大得分和对应的i、j。
优化建议:
- 上述代码的时间复杂度是 ,可以尝试使用更高效的算法。我们可以将得分公式
values[i] + values[j] + i - j变形为(values[i] + i) + (values[j] - j)。 - 对于每个
j,我们可以维护max(values[i] + i),其中i < j,这样可以将时间复杂度降低到 。
解释:
max_left = values[0] + 0:初始化max_left为values[0] + 0。- 对于每个
j,计算score = max_left + values[j] - j。 max_left = max(max_left, values[j] + j):更新max_left。- 最后找到对应的
i,使得values[i] + i == max_left - result_j。
注意事项:
- 在优化后的代码中,要注意
max_left的更新,确保它始终是max(values[i] + i)对于i < j。 - 对于
result_i的查找,要确保最终能找到正确的i,因为可能存在多个i满足values[i] + i == max_left - result_j,这里只找到第一个满足的i。
这样可以提高代码的性能,同时保持结果的正确性。
易出错点:
- 在优化后的代码中,
max_left的更新需要特别注意。如果更新逻辑错误,可能导致最终结果不准确。 - 对于
result_i的查找,由于可能存在多个i满足values[i] + i == max_left - result_j,当前代码只找到第一个满足的i。如果需要找到所有满足的i,需要修改查找逻辑,例如使用列表存储所有满足的i。 - 在计算得分
score = max_left + values[j] - j时,要确保max_left的值是正确的,否则会影响最终得分的计算。