问题描述
小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
问题理解
我们需要找到一对景点 (i, j) 使得 values[i] + values[j] + i - j 的值最大,其中 i < j。
数据结构选择
我们可以使用一个变量来记录当前的最大得分,并在遍历数组时更新这个变量。
算法步骤
-
初始化变量:
max_score用于记录当前的最大得分,初始值可以设为负无穷大。max_i_value用于记录当前i位置的最大values[i] + i值。
-
遍历数组:
- 对于每个位置
j,计算values[j] - j并与max_i_value相加,得到当前的得分。 - 更新
max_score如果当前得分更大。 - 更新
max_i_value如果values[j] + j更大。
- 对于每个位置
-
返回结果:
- 遍历结束后,
max_score即为所求的最大得分。
- 遍历结束后,
总结
通过上述步骤,我们可以在一次遍历中找到最大得分,时间复杂度为 O(n),空间复杂度为 O(1)。由此我们可以得出完整答案
完整答案
def solution(values: list) -> int:
n = len(values)
if n < 2:
return 0 # 如果数组长度小于2,无法形成组合,返回0或其他适当值
# 初始化
max_i_plus_values = values[0] + 0 # 初始时i=0
max_score = values[0] + values[1] + 0 - 1 # 初始组合 (0,1)
# 从第二个元素开始遍历
for j in range(1, n):
# 计算当前j的values[j] - j
current = values[j] - j
# 更新最大组合得分
max_score = max(max_score, max_i_plus_values + current)
# 更新max_i_plus_values
max_i_plus_values = max(max_i_plus_values, values[j] + j)
return max_score
if __name__ == '__main__':
# 测试样例1
print(solution(values=[8, 3, 5, 5, 6]) == 11) # 输出: True
# 测试样例2
print(solution(values=[10, 4, 8, 7]) == 16) # 输出: True
# 测试样例3
print(solution(values=[1, 2, 3, 4, 5]) == 8) # 输出: True