【算法】通俗分析观光景点组合得分问题

126 阅读2分钟

前言

用通俗的话来分析各种算法题-----算法小白

算法题

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

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

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

约束条件:

  • 2 <= values.length
  • 1 <= values[i] <= 1000

通俗分析(简称说人话)

这道题,到底是干啥的呢?

就是咱们出去旅游,比如说有五个景点,但时间有限,只能从中选评分高的,相对距离还比较近的两个景点去玩。

就是在有限的时间玩好。

那我们一开始对这些五个景点都不了解,就简单随便选一个,默认他为第一个,就是values[0],然后 一个一个地再去比较和分析。

怎么比较呢?人家题目是有规则的:一对景点(i<j)

values[i] + values[j] + i - j

这个得分最大,就是最优的组合方案。

一开始 那就是 选 五个景点中的第一个 max_i_plus_value= values[0] + 0 默认的为最大, 然后遍历比较 values[j]-j

那就是当前值 current_score = values[0] + values[j]-j 要最大的。

我们有了当前值后,是跟 谁比 是最大的呢? 咱们这可以设置一个 max_score 变量 ,存放每次比较完的最大值。

好了,以上是我自己的理解,有不对的地方,欢迎批评指教。再一起看看官方的解题思路。

解题思路

  1. 理解问题

    • 我们需要找到一对景点 (i, j),其中 i < j,使得 values[i] + values[j] + i - j 最大。
    • 这个表达式可以分解为 (values[i] + i) + (values[j] - j)
  2. 优化思路

    • 对于每个 j,我们只需要找到 i < j 使得 values[i] + i 最大。
    • 因此,我们可以维护一个变量 max_i_plus_value,表示在 j 之前的所有 i 中,values[i] + i 的最大值。
  3. 算法步骤

    • 初始化 max_score 为 Integer.MIN_VALUE

    • 初始化 max_i_plus_value 为 values[0] + 0

    • 遍历数组 values,对于每个 j

      • 计算当前的得分 current_score = max_i_plus_value + values[j] - j
      • 更新 max_score 如果 current_score 更大。
      • 更新 max_i_plus_value 为 Math.max(max_i_plus_value, values[j] + j)
    • 返回 max_score

代码

        // 初始化最大得分
        int max_score = Integer.MIN_VALUE;
        // 初始化最大 i + values[i]
        int max_i_plus_value = values[0];

        // 遍历数组
        for (int j = 1; j < values.length; j++) {
            // 计算当前得分
            int current_score = max_i_plus_value + values[j] - j;
            // 更新最大得分
            max_score = Math.max(max_score, current_score);
            // 更新 max_i_plus_value
            max_i_plus_value = Math.max(max_i_plus_value, values[j] + j);
        }

        return max_score;

最后

想说说题外话,好像程序里面 最最核心的就是算法,离了算法,程序就少了精气神,希望自己可以坚持下去,把这五百道题都写写自己的想法,也十分感谢MarsCode AI 的帮助,真的事半功倍!