伴学笔记|青训营X豆包MarsCode 技术训练营

67 阅读4分钟

问题描述

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

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

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


测试样例

样例1:

输入:values = [8, 3, 5, 5, 6]
输出:11

样例2:

输入:values = [10, 4, 8, 7]
输出:16

样例3:

输入:values = [1, 2, 3, 4, 5]
输出:8 以下是对这道题目的分析:

一、题目理解 1. 数据给定方式:题目通过一个数组values给出了各个观光景点的评分,并且规定景点之间的距离由它们的下标差来表示。

  1. 观光组合得分计算方式:对于一对景点(i < j),其观光组合得分的计算公式为values[i] + values[j] + i - j,即需要考虑景点的评分以及它们之间的距离因素来计算组合得分。
  2. 目标明确:要找出在哪种情况下能够获得观光景点组合的最高得分。

二、解题思路分析

  1. 暴力枚举思路: - 最直接的想法是通过两层循环来枚举所有可能的景点组合。外层循环遍历i0len(values) - 2,内层循环遍历ji + 1len(values) - 1。 - 对于每一对(i, j),根据给定的公式计算其观光组合得分,并记录下最高得分。 - 这种方法的时间复杂度为O(n2)O(n^2),其中n是景点的数量,因为需要对所有可能的景点对进行计算。
  2. 优化思路 - 一次遍历思路: - 可以尝试通过一次遍历数组来找到最高得分。 - 对于每个景点j,我们希望找到在它之前的某个景点i,使得values[i] + values[j] + i - j的值最大。 - 对公式进行变形:values[i] + values[j] + i - j = (values[i] + i) + (values[j] - j)。 - 可以先遍历数组,在遍历过程中记录下对于每个jvalues[j] - j的值,同时维护一个变量来记录当前遇到的最大的values[i] + i的值(其中i < j)。 - 这样,对于每个j,就可以通过当前最大的values[i] + i加上values[j] - j来得到当前可能的最大观光组合得分,并更新全局的最高得分。 - 这种方法的时间复杂度为O(n)O(n),只需要遍历数组一次,相比暴力枚举在效率上会有很大提升。 ### 四、测试样例分析 1. **样例1**: - 输入values = [8, 3, 5, 5, 6]。 - 暴力枚举时:会依次计算所有可能的景点组合得分,比如(0, 1)组合得分:8 + 3 + 0 - 1 = 10(0, 2)组合得分:8 + 5 + 0 - 2 = 11等等,最终找到最高得分是11。 - 一次遍历实现时:当j = 0max_values_i_plus_i = 8 + 0 = 8max_score = max(-inf, 8 + (8 - 0)) = 8;当j = 1max_values_i_ petits_i = max(8, 3 + 1) = 8max_score = max(8, 8 + (3 - 1)) = 8;当j = 2max_values_i_plus_i = max(8, 5 + 2) = 8max_score = max(8, 8 + (5 - 2)) = 11等等,最终也得到最高得分是11。 2. **样例2**: - 输入values = [10, 4, 8, 7]。 - 类似样例1的分析过程,无论是暴力枚举还是一次遍历实现,最终都能得到最高得分是16。 3. **样例3**: - 输入values = [1, 2, 3, 4, 5]。 - 同样,通过两种实现方式进行分析计算,最终都能得到最高得分是8`。

总结感悟

  1. 问题分析与公式变形的重要性:本题通过对观光组合得分公式的分析和变形,找到了一种更高效的解题思路。这让我体会到在面对一个复杂的计算公式和问题时,仔细分析公式的结构,尝试进行合理的变形,往往能发现隐藏的规律和更优的解题方法。
  2. 优化算法的必要性:暴力枚举虽然能解决问题,但时间复杂度较高,在处理大规模数据时效率会很低。而通过优化思路,如本题中的一次遍历方法,能够大大降低时间复杂度,提高算法的运行效率。这提醒我们在解决问题时,要不断思考是否有更优化的算法来替代原始的、效率较低的方法。
  3. 代码实现与理解:两种代码实现方式(暴力枚举和一次遍历)各有特点。暴力枚举代码逻辑相对简单直接,但效率低;一次遍历代码虽然实现了高效的计算,但需要对公式变形有较深入的理解才能正确编写。这让我认识到在编程中,不仅要会实现代码,更要理解背后的算法原理,这样才能根据实际情况选择最合适的实现方式。