#刷题交流# 第18天:观光景点组合得分问题
要找到一对观光景点 (i < j) 的最高得分,我们可以使用一个更高效的方法,而不是对每个可能的组合都进行两两比较。关键在于我们可以通过一次遍历就解决问题,同时维护一个当前的最佳选择。
对于任意一对 (i, j),得分计算公式为:values[i] + values[j] + i - j,可以重写为 (values[i] + i) + (values[j] - j)。因此,当我们在遍历数组时,我们可以一边遍历一边维护最大值 values[i] + i,然后在每次迭代中计算当前的 values[j] - j 并与之前的最大值相加得到可能的最高分。
解决问题的算法步骤如下:
1. 初始化变量 max_score 用于保存最高的观光组合得分,设为负无穷大或一个非常小的数。
2. 初始化变量 max_value_plus_index 保存到目前为止遇到的最大 values[i] + i 值。
3. 开始遍历数组,从第二个元素开始(因为至少需要两个景点来形成组合)。
4. 对于每个元素 values[j],根据公式 (values[j] - j) + max_value_plus_index 计算当前得分,并更新 max_score。
5. 更新 max_value_plus_index 为 max(max_value_plus_index, values[j] + j),确保它总是包含到目前为止的最大 values[i] + i。
6. 遍历结束后,max_score 就是所求的最高得分。
这个算法的时间复杂度是 O(n),其中 n 是数组的长度,因为我们只遍历了一次数组。空间复杂度是 O(1),因为我们只用了常量级别的额外空间。

第18天了,加油!!!
展开
评论