algorithm - 取K个元素,最大化最小距离

标签 algorithm

给定一个包含 N 个元素的数组,我们可以从 N 个元素中选择 K 个位置。但是我们需要以这样的方式选择 K 个位置,即如果我们取两个所选位置中的任何一个,比如 i 和 j,则比最小差值 (A[i ]-A[j])对于所有属于K个选择索引的i和j对应该尽可能大。

示例:

令 N=3 且数组 = [3 9 6 11 15 20 23 ] 且 K=3

那么这里的答案是 8,因为我们可以选择 [3,11,23] 或 [3,15,23]

我只想知道他们可以用某种贪心的方法来解决这个问题吗?还是 O(N) 或 O(N*log N) 之类的方法?

我知道它的蛮力解决方案。但我不认为将其张贴在这里是个好主意,因为它非常低效。

约束:

1 ≤ N ≤ 10^5
1 ≤ K ≤ 10^7

最佳答案

您可以对最大差值使用二分法来做到这一点。

首先对数组中的元素进行排序。

然后为最大差异选择一个值,我们称它为 D。

选择数组中最小的条目,然后遍历数组,直到我们与这个数字的距离达到 D,然后选择下一个数字。重复此操作,直到我们到达数组的末尾。

此过程将从数组中选择一定数量的值,这些值可能大于或小于 K。然后您使用 D 的二分法来找到 D 的最大值,该值允许您至少选择 K 个元素。

例如,对于 [3 6 9 11 15 20 23 ],我们可能首先选择 5 的差异:

[3 6 9 11 15 20 23 ]
D=5: 3 9 11 20 => 4 chosen too high so increase D
D=10: 3 15 => 2 chosen too low so decrease D
D=8: 3 11 20 => 3 chosen

关于algorithm - 取K个元素,最大化最小距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28812174/

相关文章:

algorithm - 寻找流网络的最小切割

c - 以任意顺序在矩阵中查找模式?

algorithm - 仅使用两个不同键快速排序 N 项数组时的最大函数调用堆栈大小是多少

algorithm - 为什么动态规划问题的简单解决方案需要指数时间?

arrays - 分而治之k-way-merge算法的时间和空间复杂度

algorithm - 找出 IP 属于哪个子网的最有效方法是什么

algorithm - 如何使用多台机器扩展算法/服务/系统?

algorithm - 为什么这种随机生成图的方式不公平?

c# - 是否有任何与word文档相关的元数据?

algorithm - 在字符串中实现数字平方根的最快方法(1000000 位)