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

52 阅读2分钟

问题描述

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

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

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

思路

  1. 我们可以使用两层循环来枚举所有可能的景点组合 (i, j),其中 i < j
  2. 对于每个组合,计算其观光组合得分 values[i] + values[j] + i - j
  3. 记录最大的得分及其对应的 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:如果当前得分大于最大得分,更新最大得分和对应的 ij

优化建议

  • 上述代码的时间复杂度是 O(n2)O(n^2),可以尝试使用更高效的算法。我们可以将得分公式 values[i] + values[j] + i - j 变形为 (values[i] + i) + (values[j] - j)
  • 对于每个 j,我们可以维护 max(values[i] + i),其中 i < j,这样可以将时间复杂度降低到 O(n)O(n)

解释

  • 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 的值是正确的,否则会影响最终得分的计算。