观光景点组合的分问题

89 阅读2分钟

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 作为输入,并返回观光景点组合的最高得分。

代码结构

  1. 初始化部分:

    • 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 为前两个元素的组合得分。
  2. 遍历部分:

    • 使用 for j in range(1, n) 从第二个元素开始遍历数组。
    • current = values[j] - j: 计算当前元素 jvalues[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
  3. 返回结果:

    • 返回 max_score

代码逻辑

代码通过遍历数组,动态更新 max_i_plus_valuesmax_score,从而找到观光景点组合的最高得分。具体来说:

  • max_i_plus_values 记录了当前遍历到的元素之前,所有元素中 values[i] + i 的最大值。
  • current 记录了当前元素 jvalues[j] - j
  • 通过 max_score = max(max_score, max_i_plus_values + current) 更新最大组合得分。

解析

代码逻辑是正确的,并且能够有效地找到观光景点组合的最高得分。以下是一些额外的解析:

  1. 时间复杂度:

    • 你的代码只遍历了一次数组,时间复杂度为 O(n),其中 n 是数组的长度。
  2. 空间复杂度:

    • 你的代码只使用了常数级别的额外空间,空间复杂度为 O(1)
  3. 边界情况:

    • 你处理了数组长度小于2的情况,返回 0,这是一个合理的处理方式。