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
代码分析
代码实现了一个函数 solution,该函数接受一个整数列表 values 作为输入,并返回观光景点组合的最高得分。
代码结构
-
初始化部分:
n = len(values): 获取数组的长度。max_i_plus_values = values[0] + 0: 初始化max_i_plus_values为第一个元素的值加上其下标(即values[0] + 0)。max_score = values[0] + values[1] + 0 - 1: 初始化max_score为前两个元素的组合得分。
-
遍历部分:
- 使用
for j in range(1, n)从第二个元素开始遍历数组。 current = values[j] - j: 计算当前元素j的values[j] - j。max_score = max(max_score, max_i_plus_values + current): 更新最大组合得分。max_i_plus_values = max(max_i_plus_values, values[j] + j): 更新max_i_plus_values。
- 使用
-
返回结果:
- 返回
max_score。
- 返回
代码逻辑
代码通过遍历数组,动态更新 max_i_plus_values 和 max_score,从而找到观光景点组合的最高得分。具体来说:
max_i_plus_values记录了当前遍历到的元素之前,所有元素中values[i] + i的最大值。current记录了当前元素j的values[j] - j。- 通过
max_score = max(max_score, max_i_plus_values + current)更新最大组合得分。
解析
代码逻辑是正确的,并且能够有效地找到观光景点组合的最高得分。以下是一些额外的解析:
-
时间复杂度:
- 你的代码只遍历了一次数组,时间复杂度为
O(n),其中n是数组的长度。
- 你的代码只遍历了一次数组,时间复杂度为
-
空间复杂度:
- 你的代码只使用了常数级别的额外空间,空间复杂度为
O(1)。
- 你的代码只使用了常数级别的额外空间,空间复杂度为
-
边界情况:
- 你处理了数组长度小于2的情况,返回
0,这是一个合理的处理方式。
- 你处理了数组长度小于2的情况,返回