跳转到下一个最接近的元素

时间:2015-04-24 19:44:55

标签: algorithm

给定N个元素的数组,编号从1到N.第i个元素具有值V [i]。所有元素都是截然不同的。

要从第i个元素移动到第j个元素,我们需要花费成本| i-j |。 但是,只有在以下情况下我们才能从第i个元素跳转到第j个元素:

  1. j不比密钥i的K位置更近(即j不应该在[i-K + 1,i + K-1]的范围内)。

  2. V [j]< V [i]中。

  3. 每个元素可以有0个或更多可以跳转到的元素。

    我们需要找到从每个元素i到可以在其后跳转的最接近元素所需的成本总和。如果没有我们可以为元素i跳转的下一个元素,则将其成本视为0。

    示例:设N = 5且K = 1且数组为[3,5,4,2,1],则此处答案为6

    说明:

    The next jumping elements for:
    1 is { }. Closest=none, so cost = 0
    2 is { 1 }. Closest=1, so cost = 1
    3 is { 1 , 2 }. Closest=2, so cost = 3
    4 is { 1 , 2 , 3 }. Closest=2, so cost= 1
    5 is { 1 , 2 , 3 , 4 }. Closest=3 or 4, so cost = 1
    

    总费用为6

    我知道一个将在O(N ^ 2)中运行的粗暴解决方案。但是1 <= N <= 2 * 10 ^ 5且1 <= K,V [i] <= N.那么有什么更好的方法可以解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

通过使用二叉树存储索引,可以将其从O(n ^ 2)减少到O(n ^ lg(n))。

从空树T开始,从1 - >迭代; N.在每一步中,当您在树中输入新索引时,您还可以获得最接近的索引。