题解:环形数组的最大贡献值

185 阅读2分钟

问题描述

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

解题思路

1. 理解环形数组

环形数组的特点是首尾相连,因此计算两个下标之间的最短距离时,需要考虑两种情况:

  • 直接在数组中计算距离。
  • 通过环形特性计算距离。

2. 计算最短距离

对于下标 i 和 j,最短距离可以是:

  • abs(i - j):直接在数组中计算的距离。
  • n - abs(i - j):通过环形特性计算的距离。

3. 遍历所有下标对

我们需要遍历所有可能的下标对 (i, j),并计算它们的贡献值。为了避免重复计算,我们可以在遍历时确保 i != j

4. 计算贡献值

使用公式 f(i, j) = (a[i] + a[j]) * dist(i, j) 计算贡献值。

5. 记录最大值

在遍历过程中,记录并更新最大贡献值。

代码实现


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 = min(abs(i - j), n - abs(i - j))
                # 计算贡献值
                contribution = (a[i] + a[j]) * dist
                # 更新最大贡献值
                max_contribution = max(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 = min(abs(i - j), n - abs(i - j)) 确保我们计算的是最短路径。
  2. 遍历所有下标对

    • 通过双重循环遍历所有可能的下标对 (i, j)
  3. 计算贡献值

    • 使用公式 (a[i] + a[j]) * dist 计算贡献值。
  4. 记录最大值

    • 在遍历过程中,不断更新最大贡献值。

总结

通过理解环形数组的特性,并正确计算最短距离,我们可以有效地找到最大贡献值。代码实现中,我们遍历所有可能的下标对,并使用公式计算贡献值,最终找到最大值。