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

72 阅读2分钟

问题描述

小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 = [8, 3, 5, 5, 6]
输出:11

样例2:

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

样例3:

输入:values = [1, 2, 3, 4, 5]
输出:8

解法

题目描述中的一对景点 (i < j) 的观光组合得分为 values[i] + values[j] + i - j等效为(values[i] + i) +(values[j]- j),题面没有说明时间复杂度和空间复杂度,经过AI解题的提示可知应限制时间复杂度为O(n)。 若不限制时间复杂度,可以使用冒泡排序的框架,每次计算(values[i] + i) +(values[j]- j)的值,并与当前存储的最大值比较,从而得出结果,这样的时间复杂度为O(n^2),因为对于每个 i,都需要遍历所有大于 i的 j 索引。 当限制了时间复杂度,可以考虑在遍历过程中每次记录两个最大值,一个存储(values[j] + j)的最大值,将其初始值设为(values[0] + 0)=(values[i]),遍历时计算新的值并与之前的值进行比较,赋值为最大值max_i;一个存储得分的最大值,即(max_i+values[j]- j)的最大值,当计算出的新值大于之前所保存的最大值,将其赋值为新值。 这两个最大值的更新有顺序要求,(values[j] + j)保存的始终是当前下标之前的下标最大值,而j是当前下标,因此要放在最后执行,用于下一次的更新。 这样,遍历一次数组即可得到结果,时间复杂度为 O(n),因为我们只需要一次线性扫描数组,且每次计算和更新的操作都可以在常数时间内完成。

具体做法如下: 1.初始化 max_i 为 values[0]+0,即第一个元素加上其索引值。 2.初始化 max_score 为负无穷,用于保存最大得分。 3.从 j=1开始遍历数组:

  • 对于每一个 j,计算当前的得分值 max_i+(values[j]−j)。
  • 更新 max_score 为这个值和当前最大得分的较大者。
  • 更新 max_i 为 max(max_i,values[j]+j) 和之前的最大值比较,更新最大值。