在n个可能的不同位置找到k个对象之间最大最小距离的有效方法是什么?
例如:
N:不同职位的数量 可以说N = 5 这5个职位是{1,2,4,8,9}
K:假设k = 3
的对象数量所以可能的答案(最大最小距离)将是:3如果我们将对象放在{1,4,8}或{1,4,9}
答案 0 :(得分:7)
让我们对答案进行二元搜索。
对于固定答案x
,我们可以使用简单的线性贪婪算法检查是否可行(选择第一个元素,然后迭代数组的其余部分,添加当前元素,如果它与最后拾取的元素之间的距离大于或等于x
)。最后,我们只需要检查所选元素的数量是否至少为k
。
时间复杂度为O(n * log MAX_A)
,其中MAX_A
是数组的最大元素。
以下是此算法的伪代码:
def isFeasible(positions, dist, k):
taken = 1
last = positions[0]
for i = 1 ... positions.size() - 1:
if positions[i] - last >= dist:
taken++
last = positions[i]
return taken >= k
def solve(positions, k):
low = 0 // definitely small enough
high = maxElement(positions) - minElement(positions) + 1 // definitely too big
while high - low > 1:
mid = (low + high) / 2
if isFeasible(positions, mid, k):
low = mid
else:
high = mid
return low