问题描述
小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values 中,其中 values[i] 表示第 i 个观光景点的评分。同时,景点之间的距离由它们的下标差 j - i 表示。
一对景点 (i < j) 的观光组合得分为 values[i] + values[j] + i - j,也就是两者评分之和减去它们之间的距离。
小R想知道,在哪种情况下能够获得观光景点组合的最高得分
好的,让我们来逐步解决这个问题。首先,我们需要理解题目要求:找到一对景点 (i, j) 使得 values[i] + values[j] + i - j 最大,其中 i < j。
解题思路
-
分解公式:我们可以将公式
values[i] + values[j] + i - j分解为(values[i] + i) + (values[j] - j)。这样,我们可以分别处理values[i] + i和values[j] - j。 -
遍历数组:我们可以遍历数组
values,对于每个j,我们只需要找到在j之前的i使得values[i] + i最大。 -
动态更新最大值:在遍历过程中,我们可以动态更新
values[i] + i的最大值,并用它来计算当前的j对应的得分。
代码提示
以下是代码的框架,其中关键步骤用注释标出:
def solution(values: list) -> int:
# 初始化最大得分
max_score = float('-inf')
# 初始化当前最大 values[i] + i
max_i_plus_value = float('-inf')
# 遍历数组
for j in range(len(values)):
# 计算当前的得分
current_score = max_i_plus_value + (values[j] - j)
# 更新最大得分
if current_score > max_score:
max_score = current_score
# 更新 max_i_plus_value
if values[j] + j > max_i_plus_value:
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,计算当前得分current_score,并更新max_score。 - 更新
max_i_plus_value:在每次遍历中,更新max_i_plus_value以确保它始终是当前最大的values[i] + i。
在编程中,遍历数组是一个非常基础且常见的操作。遍历数组意味着逐个访问数组中的每个元素,并对其进行某种操作。在Python中,我们可以使用多种方式来遍历数组。
遍历数组的几种常见方式
-
使用
for循环: 这是最常见的遍历数组的方式。for循环可以直接遍历数组中的每个元素。values = [8, 3, 5, 5, 6] for value in values: print(value) -
使用
range和索引: 如果你需要同时访问元素和它们的索引,可以使用range和len函数。values = [8, 3, 5, 5, 6] for i in range(len(values)): print(f"Index: {i}, Value: {values[i]}") -
使用
enumerate函数:enumerate函数可以同时返回元素的索引和值,这在需要同时处理索引和值时非常方便。values = [8, 3, 5, 5, 6] for i, value in enumerate(values): print(f"Index: {i}, Value: {value}")
在当前代码中的应用
在你的代码中,遍历数组的操作可以用于计算每个景点的得分。以下是一个示例,展示了如何在 solution 函数中使用遍历数组来计算最大得分:
def solution(values: list) -> int:
max_score = float('-inf')
max_i_plus_value = float('-inf')
# 遍历数组
for j in range(len(values)):
current_score = max_i_plus_value + (values[j] - j)
if current_score > max_score:
max_score = current_score
if values[j] + j > max_i_plus_value:
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)
关键点
- 遍历数组:使用
for循环遍历数组中的每个元素。 - 动态更新:在遍历过程中,动态更新
max_i_plus_value和max_score。
通过这种方式,你可以有效地计算出观光景点组合的最高得分。