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

48 阅读3分钟

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

问题描述

小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。然后,我们比较这些得分以找出最大值。

解题思路

  1. 初始化一个变量 max_score 来存储最高得分,初始值为负无穷大(或者一个非常小的值)。
  2. 使用两层循环遍历数组 values,外层循环变量为 i,内层循环变量为 j,并且确保 i < j
  3. 对于每一对 (i, j),计算它们的组合得分 score = values[i] + values[j] + i - j
  4. 如果计算出的 score 大于当前的 max_score,则更新 max_score
  5. 在遍历完所有的景点对后,max_score 将包含所有可能组合中的最高得分。
  6. 返回或输出 max_score 作为结果。

解题代码

def solution(values: list) -> int:
    # write code here
    maxSocre = 0
    
    for i in range(len(values)):
        for j in range(i + 1, len(values)):
            socre = values[i] + values[j] + i - j
            if socre > maxSocre:
                maxSocre = socre

    return maxSocre  # Placeholder return

if __name__ == '__main__':
    print(solution(values=[8, 3, 5, 5, 6]) == 11)
    print(solution(values=[10, 4, 8, 7]) == 16)
    print(solution(values=[1, 2, 3, 4, 5]) == 8)

总结与思考

遇到的问题

  1. 嵌套循环要注意数组的范围,不要出现数组越界的情况
  2. j的起始值是j + 1,不是j不要弄错,会导致结果出错

收获与感悟

我采用的是最直接的方法是使用两层循环来遍历所有的景点对 (i, j),其中 i < j。对于每一对,计算其组合得分,并跟踪最大得分。这种方法的时间复杂度为 O(n2),其中 n 是景点的数量。虽然暴力法简单直接,但在面对大量景点时可能效率不高。可以考虑是否有其他方法可以减少不必要的计算或提前终止某些循环。在某些情况下,可以使用动态规划或其他算法技巧来优化解的搜索过程。例如,如果景点评分和距离有特定的模式或关系,可能可以利用这些信息来减少计算量。在编写代码时,注意代码的清晰性和可维护性。使用有意义的变量名和添加必要的注释可以帮助其他人更好地理解代码。然后我们要对代码进行充分的测试,确保它在各种情况下都能正确运行。这包括边界情况和特殊输入。