问题描述 小S拿到了一个长度为 𝑛 的环形数组,并定义了两个下标 𝑖和 𝑗 的贡献值公式为: f(i, j) = (a_i + a_j) × dist(i, j) 其中 dist(i, j) 是下标 i 和 𝑗在数组中的最短距离。小S希望找到一对下标,使得它们的贡献值尽可能大。环形数组的特点是最左和最右的元素也是相邻的。你需要帮助她找到最大贡献值。
例如,给定数组 [1, 2, 3],由于是环形数组,任意两个下标的距离都是1,因此 𝑓(2,3)=(2+3)×1=5 f(2,3)=(2+3)×1=5。
理解问题 题目要求在一个环形数组中找到一对下标 (i, j),使得它们的贡献值 f(i, j) = (a_i + a_j) × dist(i, j) 最大。其中 dist(i, j) 是下标 i 和 j 在数组中的最短距离。环形数组的特点是数组的首尾相连,即最左和最右的元素也是相邻的。 2. 数据结构的选择 由于题目涉及数组操作,我们选择使用数组来存储数据。数组的下标可以直接用于计算距离。 3. 算法步骤 遍历所有可能的下标对: 由于数组是环形的,我们需要考虑所有可能的下标对 (i, j),其中 i 和 j 可以相同。 计算距离: 对于任意两个下标 i 和 j,计算它们在环形数组中的最短距离 dist(i, j)。由于数组是环形的,最短距离可以通过 min((j - i) % n, (i - j) % n) 计算。 计算贡献值: 对于每一对下标 (i, j),计算贡献值 f(i, j) = (a[i] + a[j]) * dist(i, j)。 更新最大贡献值: 在遍历过程中,记录并更新最大贡献值。 4. 时间复杂度分析 时间复杂度:由于需要遍历所有可能的下标对 (i, j),时间复杂度为 O(n^2),其中 n 是数组的长度。 空间复杂度:只使用了常数级别的额外空间,空间复杂度为 O(1)。 总结 通过遍历所有可能的下标对,计算每对下标的贡献值,并记录最大值,可以有效地解决这个问题。环形数组的特性使得我们需要特别注意距离的计算方式。
函数定义: solution 函数定义正确,接受两个参数 n 和 a,分别表示数组的长度和数组本身。 测试用例: 测试用例部分定义正确,调用了 solution 函数并打印结果,用于验证函数的正确性。 需要实现的部分 你需要在 solution 函数中实现以下逻辑: 计算任意两个下标的贡献值: 对于环形数组,任意两个下标 i 和 j 的距离 dist(i, j) 可以通过 min((j - i) % n, (i - j) % n) 计算。 贡献值 f(i, j) 可以通过 (a[i] + a[j]) * dist(i, j) 计算。 遍历所有可能的下标对: 遍历所有可能的下标对 (i, j),计算它们的贡献值,并记录最大值。 代码框架
以下是一个代码框架,帮助你实现上述逻辑: 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(i, j)
dist = min((j - i) % n, (i - j) % n)
# 计算贡献值 f(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)
解释: 遍历所有下标对:通过两层循环遍历所有可能的下标对 (i, j)。 计算距离:使用 min((j - i) % n, (i - j) % n) 计算环形数组中两个下标的最短距离。 计算贡献值:使用 (a[i] + a[j]) * dist 计算贡献值。 更新最大值:使用 max 函数更新最大贡献值。