【发布时间】:2021-08-15 18:35:15
【问题描述】:
我正在解决算法研究的实践问题,并为以下问题寻找最快的实现。
给定一个长度为N的正一位整数列表L,在L中定义三个点A、B和C,以便列表分为三个分区。请注意,A < B < C 在索引方面。第一个分区是A和B之间的所有元素,第二个分区是B和C之间的所有元素,第三个分区是所有其他元素。
然后让h、i和j成为每个分区的总和。我想在所有可能的分区中找到max([h, i, j]) - min([h, i, j]) 的最小值。
例如,如果L = [4, 5, 6, 7, 6, 5, 4],那么分份将是
a = [6, 7]
b = [6, 5]
c = [4, 5, 4] # reminder
# because
h = sum(a) -> 13
i = sum(b) -> 11
j = sum(c) -> 13
# that minimize the difference
max([h, i, j]) - min([h, i, j]) -> 2
我目前想出的唯一方法是暴力破解所有可能的分区,以便
current_min = sum(L)
N = len(L)
for A in range(N):
for B in range(A, N):
for C in range(B, N):
sum_1 = sum(L[A:B])
sum_2 = sum(L[B:C])
sum_3 = sum(L[:A]) + sum(L[C:])
sums = [sum_1, sum_2, sum_3]
if max(sums) - min(sums) < current_min:
current_min = max(sums) - min(sums)
但我可以看到我的解决方案并不理想。有没有更快的方法?
【问题讨论】:
-
不,这是一个类似的问题,但在我的问题中,目标是最小化最小部分之和与最大分区之和之间的差异。因此最小化的最大值是不够的,还需要最大化最小分区的和的最小值。实际上,该问题的第一个测试用例中的答案是 {2, 1}, {5, 1}, {2, 2, 2} 这不是我问题的答案,应该是 {2, 2, 1}、{5、1}、{2、2}。