给定N个元素的数组,编号从1到N.第i个元素具有值V [i]。所有元素都是截然不同的。
要从第i个元素移动到第j个元素,我们需要花费成本| i-j |。 但是,只有在以下情况下我们才能从第i个元素跳转到第j个元素:
j不比密钥i的K位置更近(即j不应该在[i-K + 1,i + K-1]的范围内)。
V [j]< V [i]中。
每个元素可以有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.那么有什么更好的方法可以解决这个问题呢?
答案 0 :(得分:0)
通过使用二叉树存储索引,可以将其从O(n ^ 2)减少到O(n ^ lg(n))。
从空树T开始,从1 - >迭代; N.在每一步中,当您在树中输入新索引时,您还可以获得最接近的索引。