环形数组的最大贡献值| 豆包MarsCode AI刷题

60 阅读2分钟

问题描述

小S拿到了一个长度为 nn 的环形数组,并定义了两个下标 ii 和 jj 的贡献值公式为:
f(i, j) = (a_i + a_j) × dist(i, j)
其中 dist(i, j) 是下标 ii 和 jj 在数组中的最短距离。小S希望找到一对下标,使得它们的贡献值尽可能大。环形数组的特点是最左和最右的元素也是相邻的。你需要帮助她找到最大贡献值。

例如,给定数组 [1, 2, 3],由于是环形数组,任意两个下标的距离都是1,因此 f(2,3)=(2+3)×1=5f(2,3)=(2+3)×1=5。


测试样例

样例1:

输入:n = 3,a = [1, 2, 3]
输出:5

样例2:

输入:n = 4,a = [4, 1, 2, 3]
输出:12

样例3:

输入:n = 5,a = [1, 5 , 3, 7, 2]
输出:24

问题理解

  1. 环形数组:数组是环形的,这意味着数组的第一个元素和最后一个元素是相邻的。
  2. 贡献值公式f(i, j) = (a_i + a_j) × dist(i, j),其中 dist(i, j) 是下标 i 和 j 在数组中的最短距离。
  3. 目标:找到一对下标 (i, j),使得 f(i, j) 最大。

数据结构选择

由于我们需要计算任意两个元素之间的距离,并且数组是环形的,因此我们需要考虑如何高效地计算距离。

算法步骤

  1. 计算距离

    • 对于任意两个下标 i 和 j,距离 dist(i, j) 可以通过以下公式计算:

      • dist(i, j) = min(|i - j|, n - |i - j|),其中 n 是数组的长度。
  2. 遍历所有可能的组合

    • 我们需要遍历所有可能的下标对 (i, j),并计算 f(i, j)
    • 由于数组是环形的,我们需要考虑所有可能的组合,包括跨越数组边界的组合。
  3. 计算贡献值

    • 对于每一对 (i, j),计算 f(i, j) 并记录最大值。