景观景点组合问题 | 豆包MarsCode AI刷题

46 阅读3分钟

根据给出的算法步骤和分解方式,我们可以直接实现对应的代码框架,解决这个问题。以下是代码实现:

Python 实现

python
复制代码
def max_score_sightseeing_pair(values: list) -> int:
    # 初始化最大得分为负无穷大
    max_score = float('-inf')
    # 初始化当前最大的 values[i] + i
    max_i_plus_value = values[0] + 0
    
    # 遍历数组,从第二个元素开始
    for j in range(1, len(values)):
        # 计算当前的得分
        current_score = max_i_plus_value + values[j] - j
        # 更新最大得分
        max_score = max(max_score, current_score)
        # 更新最大 values[i] + i
        max_i_plus_value = max(max_i_plus_value, values[j] + j)
    
    return max_score

# 测试用例
if __name__ == '__main__':
    print(max_score_sightseeing_pair([8, 1, 5, 2, 6]) == 11)  # 最佳组合是 (i=0, j=2)
    print(max_score_sightseeing_pair([1, 2]) == 2)            # 最佳组合是 (i=0, j=1)

详细解析

  1. 初始化变量:

    • max_score 用于存储最终的最大得分。
    • max_i_plus_value 表示当前最大的 values[i] + i,这是在遍历到当前元素之前所有可能的 values[i] + i 中最大的值。
  2. 遍历数组:

    • 从第二个元素开始,计算 values[j] - j 的值,并将其与 max_i_plus_value 相加,得到当前的 current_score
    • 更新 max_score,确保我们记录的是最大得分。
    • 更新 max_i_plus_value,确保后续的计算可以使用最新的最大值。
  3. 返回结果:

    • 遍历结束后,max_score 存储的就是最大得分。

复杂度分析

  1. 时间复杂度:

    • 遍历数组一次,时间复杂度为 O(n)。
  2. 空间复杂度:

    • 只使用了常数个变量,空间复杂度为 O(1)。 根据给出的算法步骤和分解方式,我们可以直接实现对应的代码框架,解决这个问题。以下是代码实现:

Python 实现

python
复制代码
def max_score_sightseeing_pair(values: list) -> int:
    # 初始化最大得分为负无穷大
    max_score = float('-inf')
    # 初始化当前最大的 values[i] + i
    max_i_plus_value = values[0] + 0
    
    # 遍历数组,从第二个元素开始
    for j in range(1, len(values)):
        # 计算当前的得分
        current_score = max_i_plus_value + values[j] - j
        # 更新最大得分
        max_score = max(max_score, current_score)
        # 更新最大 values[i] + i
        max_i_plus_value = max(max_i_plus_value, values[j] + j)
    
    return max_score

# 测试用例
if __name__ == '__main__':
    print(max_score_sightseeing_pair([8, 1, 5, 2, 6]) == 11)  # 最佳组合是 (i=0, j=2)
    print(max_score_sightseeing_pair([1, 2]) == 2)            # 最佳组合是 (i=0, j=1)

详细解析

  1. 初始化变量:

    • max_score 用于存储最终的最大得分。
    • max_i_plus_value 表示当前最大的 values[i] + i,这是在遍历到当前元素之前所有可能的 values[i] + i 中最大的值。
  2. 遍历数组:

    • 从第二个元素开始,计算 values[j] - j 的值,并将其与 max_i_plus_value 相加,得到当前的 current_score
    • 更新 max_score,确保我们记录的是最大得分。
    • 更新 max_i_plus_value,确保后续的计算可以使用最新的最大值。
  3. 返回结果:

    • 遍历结束后,max_score 存储的就是最大得分。

复杂度分析

  1. 时间复杂度:

    • 遍历数组一次,时间复杂度为 O(n)。
  2. 空间复杂度:

    • 只使用了常数个变量,空间复杂度为 O(1)。