青训营X豆包MarsCode 技术训练营第一课 | 豆包MarsCode AI 刷题

75 阅读3分钟

关于第11题观光景点组合得分问题:

题目描述了一种观光景点评分的组合问题,要求我们在给定的景点评分数组中,找到一对景点(i < j),使得它们的观光组合得分最高。观光组合得分的计算公式为:values[i] + values[j] + i - j。这个问题实际上是一个典型的数组遍历问题,通过双重循环遍历数组中的所有可能组合,然后计算每种组合的得分,最终找到最高得分。

首先,我们来分析一下这个问题的核心。观光组合得分由两部分组成:景点评分之和和景点之间的距离。景点评分之和是正值,而景点之间的距离是负值。因此,为了使观光组合得分最高,我们需要找到两个景点,它们的评分之和尽可能大,同时它们之间的距离尽可能小。

  def solution(values: list) -> int:
# write code here
max = 0
for i in range(len(values)):
    left = i
    right = len(values)-1
    while right >left:
        if max < values[right]+ values[left]+left - right:
            max = values[right]+ values[left]+left - right
        right -=1
return max  

在给出的代码中,我们使用了一个双重循环来遍历所有可能的景点组合。外层循环遍历数组中的每个景点,内层循环从当前景点的下一个景点开始,一直遍历到数组末尾。这样,我们就可以保证每次计算的都是 i < j 的情况。

在每次内层循环中,我们计算当前景点组合的得分,并与当前最高得分进行比较。如果当前景点组合的得分高于最高得分,我们就更新最高得分。通过这种方式,我们可以在遍历完所有可能的景点组合后,找到最高得分。

下面,我们通过几个示例来具体分析这个问题:

  1. 当 values=[8, 3, 5, 5, 6] 时,最高得分为 11。这个得分是由景点 1(评分 8)和景点 5(评分 6)组成的,得分计算为:8 + 6 + 1 - 5 = 11。
  2. 当 values=[10, 4, 8, 7] 时,最高得分为 16。这个得分是由景点 1(评分 10)和景点 4(评分 7)组成的,得分计算为:10 + 7 + 1 - 4 = 16。
  3. 当 values=[1, 2, 3, 4, 5] 时,最高得分为 8。这个得分是由景点 2(评分 2)和景点 5(评分 5)组成的,得分计算为:2 + 5 + 2 - 5 = 8。

通过以上分析,我们可以看出,这个问题的关键在于如何高效地找到两个景点,使得它们的评分之和最大,同时它们之间的距离最小。在给出的代码中,我们采用了一种简单粗暴的方法,即遍历所有可能的景点组合。虽然这种方法在时间复杂度上较高(O(n^2)),但它能够确保我们找到最高得分的景点组合。

总之,这个问题通过双重循环遍历数组,计算所有可能的景点组合得分,最终找到最高得分。这种方法虽然简单,但在一定程度上能够解决问题。在实际应用中,如果数据量较大,可以考虑使用更高效的算法来优化性能。