青训营X豆包MarsCode技术训练营第一课

40 阅读3分钟

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

数据结构选择

  • 由于我们需要计算任意两个元素之间的距离,并且数组是环形的,因此我们需要考虑所有可能的 (i, j) 组合。

算法步骤

  1. 计算距离

    • 对于任意两个下标 i 和 j,计算它们在环形数组中的最短距离 dist(i, j)
    • 距离可以通过两种方式计算:顺时针距离和逆时针距离,取两者中的最小值。
  2. 计算贡献值

    • 对于每一对 (i, j),计算 f(i, j) = (a_i + a_j) × dist(i, j)
  3. 寻找最大值

    • 遍历所有可能的 (i, j) 组合,记录并更新最大贡献值。

总结

  • 你需要遍历所有可能的 (i, j) 组合,计算每对组合的贡献值,并记录最大值。
  • 由于数组是环形的,计算距离时需要考虑两种情况:顺时针和逆时针。
  • 代码提示

  1. 计算距离

    • 对于环形数组,距离可以通过两种方式计算:顺时针距离和逆时针距离,取两者中的最小值。
  2. 计算贡献值

    • 对于每一对 (i, j),计算 f(i, j) = (a_i + a_j) × dist(i, j)
  3. 寻找最大值

    • 遍历所有可能的 (i, j) 组合,记录并更新最大贡献值。

代码框架

python

def solution(n: int, a: list) -> 

int:

    max_contribution = 0

    

    # 遍历所有可能的 (i, j) 组合

    for i in range(n):

        for j in range(n):

            if i != j:

                # 计算顺时针距离

                dist_clockwise = abs

                (i - j)

                # 计算逆时针距离

                dist_counterclockwis

                e = n - 

                dist_clockwise

                # 取最短距离

                dist = min

                (dist_clockwise, 

                dist_counterclockwis

                e)

                

                # 计算贡献值

                contribution = (a

                [i] + a[j]) * dist

                

                # 更新最大贡献值

                if contribution > 

                max_contribution:

                    max_contribution

                     = contribution

    

    return max_contribution

if name == 'main':

    print(solution(n = 3, a = [1, 

    2, 3]) == 5)

    print(solution(n = 4, a = [4, 

    1, 2, 3]) == 12)

    print(solution(n = 5, a = [1, 

    5, 3, 7, 2]) == 24)

关键步骤解释

  1. 计算距离

    • dist_clockwise 是顺时针距离,dist_counterclockwise 是逆时针距离。
    • dist 取两者中的最小值。
  2. 计算贡献值

    • contribution = (a[i] + a[j]) * dist 计算当前组合的贡献值。
  3. 更新最大贡献值

    • 如果当前贡献值大于 max_contribution,则更新 max_contribution

注意

  • 代码中使用了嵌套循环来遍历所有可能的 (i, j) 组合,这可能会导致时间复杂度较高。如果数组长度较大,可以考虑优化算法。