算法 - 查找具有最小距离

时间:2016-02-15 14:21:26

标签: arrays algorithm

我试图找到一种算法,找出两个数字之间最小距离 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

有没有人知道这样做的有效算法,或者有任何想法?

我尝试过一种算法,找到最大数量,将其与其他可能的数据进行比较,然后检查每个可能没有最小距离的每个值...但是当数组时这个非常慢由许多数字组成,特别是当最小距离很大时。

注意:所有数字都正面

感谢。

1 个答案:

答案 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值可以即时生成。