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

83 阅读2分钟

问题描述

小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values 中,其中 values[i] 表示第 i 个观光景点的评分。同时,景点之间的距离由它们的下标差 j - i 表示。

一对景点 (i < j) 的观光组合得分为 values[i] + values[j] + i - j,也就是两者评分之和减去它们之间的距离。

小R想知道,在哪种情况下能够获得观光景点组合的最高得分。

做题链接: www.marscode.cn/practice/on…

解题思路

我们需要找到一对景点 (i, j) 使得 values[i] + values[j] + i - j 最大,其中 i < j。这个公式可以分解为 (values[i] + i) + (values[j] - j)

  1. 分解公式:我们可以将公式 values[i] + values[j] + i - j 分解为 (values[i] + i) + (values[j] - j)。这样,我们可以分别处理 values[i] + i 和 values[j] - j
  2. 动态规划思想:我们可以遍历数组,同时维护一个变量 max_i_plus_value,表示当前遍历到的 i 之前的最大 values[i] + i。对于每个 j,我们只需要计算 max_i_plus_value + values[j] - j,并更新最大得分。

详细代码

详细代码如下:

def solution(values: list) -> int:
    # 初始化最大得分
    max_score = float('-inf')
    
    # 初始化 max_i_plus_value 为第一个元素的 values[0] + 0
    max_i_plus_value = values[0]
    
    # 遍历数组,从第二个元素开始
    for j in range(1, len(values)):
        # 计算当前的得分
        current_score = max_i_plus_value + values[j] - j
        
        # 更新最大得分
        max_score = max(max_score, current_score)
        
        # 更新 max_i_plus_value
        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[0],表示当前遍历到的 i 之前的最大 values[i] + i

然后从第二个元素开始遍历数组。对于每个元素 j,计算当前的得分 current_score,即 max_i_plus_value + values[j] - j。更新 max_score 为 max_score 和 current_score 中的较大值。更新 max_i_plus_value 为 max_i_plus_value 和 values[j] + j 中的较大值。

本题目的解法时间复杂度 O(1),时间复杂度是 O(n)。

小结

通过这道题目,我们可以学到如何通过公式分解、动态规划、时间空间复杂度优化、代码简洁性和边界条件处理来设计高效的算法。这些思考点不仅适用于本题,也适用于其他类似的算法问题。