问题理解
我们需要找到一对景点 (i, j) 使得 values[i] + values[j] + i - j 的值最大,其中 i < j。
数据结构选择
我们可以使用一个变量来记录当前的最大得分,并在遍历数组时更新这个变量。
算法步骤
- 初始化:初始化一个变量
maxScore来记录当前的最大得分,初始值为 0。 - 遍历数组:从左到右遍历数组
values。 - 更新最大得分:对于每个位置
j,计算values[i] + values[j] + i - j的值,并与maxScore比较,更新maxScore。 - 返回结果:遍历结束后,
maxScore即为所求的最大得分。
关键点
- 在遍历过程中,我们需要维护一个变量来记录当前最大的
values[i] + i,这样可以避免重复计算。
通过这种方式,我们可以在一次遍历中找到最大得分,时间复杂度为 O(n)。
maxv 的初始值设置为 0 是为了确保在遍历数组时,能够正确地计算和更新最大得分。让我们详细解释一下为什么 maxv 的初始值是 0。
详细解释
-
maxv的作用:maxv用于记录当前遍历过的位置中values[j] + j的最大值。这个值用于计算当前位置i和之前某个位置j的组合得分。 -
初始值的选择:
maxv的初始值应该是一个不会影响最终结果的值。由于values[j] + j是一个正数(假设评分和下标都是非负的),初始值为 0 是一个合理的选择。 -
初始化
maxv和res:maxv初始化为 0,用于记录当前遍历过的位置中values[j] + j的最大值。res初始化为 0,用于记录当前的最大得分。
-
遍历数组:
- 使用
for循环遍历数组values。
- 使用
-
更新
maxv和res:- 在每次遍历时,更新
res,计算当前位置i和之前某个位置j的组合得分。 - 更新
maxv,记录当前遍历过的位置中values[j] + j的最大值。
- 在每次遍历时,更新
-
返回结果:
- 在遍历结束后,返回
res,即最大得分。
- 在遍历结束后,返回
为什么初始值为 0 是合理的?
- 不会影响计算:在第一次遍历时,
maxv会被更新为第一个位置的values[j] + j。如果初始值设置为其他值(例如负数),可能会影响第一次计算的结果。 - 简化逻辑:初始值为 0 简化了逻辑,避免了额外的条件判断。
代码中的具体作用
在代码中,maxv 的初始值为 0 确保了在第一次遍历时,maxv 会被正确更新为第一个位置的 values[j] + j。这样,后续的计算不会受到初始值的影响。### 示例
假设 values = [8, 3, 5, 5, 6],初始时 maxv = 0:
- 第一次遍历到
values[0] = 8,maxv更新为8 + 0 = 8。 - 第二次遍历到
values[1] = 3,maxv更新为8(因为3 + 1 = 4小于8)。 - 以此类推,
maxv会记录当前遍历过的位置中values[j] + j的最大值。
总结
maxv 的初始值为 0 是为了确保在遍历数组时,能够正确地计算和更新最大得分,并且简化了逻辑。