我试图找到一种算法,找出两个数字之间最小距离 D 的最大总和。
例如,假设我们有8个数字的数组,并且总和的最小距离 2 :
9 4 6 2 8 7 5 6
9 can be paired with 2, 8, 7, 5, 6
4 can be paired with 8, 7, 5, 6
6 can be paired with 7, 5, 6
2 can be paired with 9 (from the left side), 5, 6
8 can be paired with 9, 4 and 6
etc..
从这个数组可以看出,最大可能总和是9 + 8 = 17
有没有人知道这样做的有效算法,或者有任何想法?
我尝试过一种算法,找到最大数量,将其与其他可能的数据进行比较,然后检查每个可能没有最小距离的每个值...但是当数组时这个非常慢由许多数字组成,特别是当最小距离很大时。
注意:所有数字都正面
感谢。
答案 0 :(得分:2)
对于数组中的每个位置,查找并存储最多到该位置的元素。通过更新每个步骤中的最大值,可以在O(n)中对所有位置进行此操作。
通过以相同方式从右向左扫描,为每个位置查找并存储从该位置到结尾的所有元素的最大值。
现在,对于每个元素,array[pos] + max(max_up_to[pos-D], max_from[pos+D])
将为您提供可以使用该元素生成的最高总和。所以另一个O(n)传球给你最大的所有元素。
总计:O(n)时间,O(n)空间。
实际上,您甚至不需要额外的空间:不需要max_from
数组,因为它足以评估array[pos] + max_up_to[pos-D]
(因为否则每个总和将生成两次)。当您在数组上进行迭代时,max_up_to
值可以即时生成。