问题描述
小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)
代码解释
-
计算最短距离:
dist = min(abs(i - j), n - abs(i - j))确保我们计算的是最短路径。
-
遍历所有下标对:
- 通过双重循环遍历所有可能的下标对
(i, j)。
- 通过双重循环遍历所有可能的下标对
-
计算贡献值:
- 使用公式
(a[i] + a[j]) * dist计算贡献值。
- 使用公式
-
记录最大值:
- 在遍历过程中,不断更新最大贡献值。
总结
通过理解环形数组的特性,并正确计算最短距离,我们可以有效地找到最大贡献值。代码实现中,我们遍历所有可能的下标对,并使用公式计算贡献值,最终找到最大值。