采用K元素并最大化最小距离

时间:2015-03-02 14:26:01

标签: 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

2 个答案:

答案 0 :(得分:1)

1. Sort the numbers
2. Pick first two numbers with maximum difference between them.
3. For i = 3 to k
   3.1 Pick the number that has maximum difference

示例

1. [3 9 6 11 15 20 23] -> [3 6 9 11 15 20 23]
2. [3 23]
3. Pick 11 or 15

Complexity = O(N log N) [(k + N)log N]

答案 1 :(得分:1)

你可以用最大差值的二分法来做到这一点。

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

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

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

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

例如,对于[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