小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。
问题理解
- 环形数组:数组是环形的,意味着数组的第一个元素和最后一个元素是相邻的。
- 贡献值公式:
f(i, j) = (a_i + a_j) × dist(i, j),其中dist(i, j)是下标i和j在数组中的最短距离。 - 目标:找到一对下标
(i, j),使得f(i, j)最大。
数据结构选择
- 由于我们需要计算任意两个元素之间的距离,并且数组是环形的,因此我们需要考虑所有可能的
(i, j)组合。
算法步骤
-
计算距离:
- 对于任意两个下标
i和j,计算它们在环形数组中的最短距离dist(i, j)。 - 距离可以通过两种方式计算:顺时针距离和逆时针距离,取两者中的最小值。
- 对于任意两个下标
-
计算贡献值:
- 对于每一对
(i, j),计算f(i, j) = (a_i + a_j) × dist(i, j)。
- 对于每一对
-
寻找最大值:
- 遍历所有可能的
(i, j)组合,记录并更新最大贡献值。
- 遍历所有可能的
总结
- 你需要遍历所有可能的
(i, j)组合,计算每对组合的贡献值,并记录最大值。 - 由于数组是环形的,计算距离时需要考虑两种情况:顺时针和逆时针。
-
代码提示
-
计算距离:
- 对于环形数组,距离可以通过两种方式计算:顺时针距离和逆时针距离,取两者中的最小值。
-
计算贡献值:
- 对于每一对
(i, j),计算f(i, j) = (a_i + a_j) × dist(i, j)。
- 对于每一对
-
寻找最大值:
- 遍历所有可能的
(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)
关键步骤解释
-
计算距离:
dist_clockwise是顺时针距离,dist_counterclockwise是逆时针距离。dist取两者中的最小值。
-
计算贡献值:
contribution = (a[i] + a[j]) * dist计算当前组合的贡献值。
-
更新最大贡献值:
- 如果当前贡献值大于
max_contribution,则更新max_contribution。
- 如果当前贡献值大于
注意
- 代码中使用了嵌套循环来遍历所有可能的
(i, j)组合,这可能会导致时间复杂度较高。如果数组长度较大,可以考虑优化算法。