问题描述
小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values 中,其中 values[i] 表示第 i 个观光景点的评分。同时,景点之间的距离由它们的下标差 j - i 表示。
一对景点 (i < j) 的观光组合得分为 values[i] + values[j] + i - j,也就是两者评分之和减去它们之间的距离。
小R想知道,在哪种情况下能够获得观光景点组合的最高得分。
约束条件:
- 2 <=
values.length - 1 <=
values[i]<= 1000
测试样例
样例1:
输入:
values = [8, 3, 5, 5, 6]
输出:11
样例2:
输入:
values = [10, 4, 8, 7]
输出:16
样例3:
输入:
values = [1, 2, 3, 4, 5]
输出:8
解题思路
-
公式分解:
- 公式
values[i] + values[j] + i - j可以分解为(values[i] + i) + (values[j] - j)。 - 这意味着我们可以分别计算
values[i] + i和values[j] - j,然后找到使得两者之和最大的组合。
- 公式
-
优化思路:
- 我们可以遍历数组,同时维护一个变量来记录当前最大的
values[i] + i。 - 对于每个
j,我们计算values[j] - j并与当前最大的values[i] + i相加,更新最大得分。
- 我们可以遍历数组,同时维护一个变量来记录当前最大的
完整代码示例-python
def solution(values: list) -> int:
# 初始化最大得分
max_score = float('-inf')
# 初始化当前最大的 values[i] + i
max_i_plus_value = float('-inf')
# 遍历数组
for j in range(len(values)):
# 计算 values[j] - j
j_minus_value = values[j] - j
# 更新最大得分
max_score = max(max_score, max_i_plus_value + j_minus_value)
# 更新当前最大的 values[i] + i
max_i_plus_value = max(max_i_plus_value, values[j] + j)
return max_score
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)
关键步骤解释
-
初始化:
max_score用于记录当前找到的最大得分。max_i_plus_value用于记录当前最大的values[i] + i。
-
遍历数组:
- 对于每个
j,计算values[j] - j。 - 更新
max_score,即当前的max_i_plus_value加上values[j] - j。 - 更新
max_i_plus_value,即当前的values[j] + j。
- 对于每个
通过这种方式,可以在一次遍历中找到最大得分,时间复杂度为 O(n)。