给定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
答案 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