【问题标题】:largest minimum difference of n elements in an array数组中 n 个元素的最大最小差
【发布时间】:2020-08-09 18:56:31
【问题描述】:

给定一个数组 A 和数字 N。

从数组 A 中选择 N 个元素,使得这 N 个数字之间的最小差异最大化。返回最大的最小差异。

示例 1. A = {1,2,4,8,9},N = 3

输出: 3 (因为 {1,4,9} 最大化了这 3 个数字之间的差异。4-1=3, 9-4=5)

示例 2。 A = {4,1,2,8,90,900},N = 4

输出: 7

这是一个数据结构课程的问题,我为这个问题纠结了一整天,希望有人能帮助我。谢谢!

【问题讨论】:

  • 请尝试通过发布您尝试过的解决方案来证明您的努力。否则,您似乎是在要求社区完成您的家庭作业。

标签: algorithm data-structures tree binary-search


【解决方案1】:
  1. 对数组进行排序
  2. 对于 N=2,输出将是 [0] 和 [n] 中的值,其中 0 和 n 是数组的索引(n 是数组的长度)
  3. 对于 N=3 0,n 和 n/2(如果 n 是奇数,您需要检查哪个更好 n/2 和 n/2+1)并将数组拆分为 2
  4. 对于 N=4,您需要检查 2 个数组中哪个“中位数”的结果最好。
  5. 我想你明白了,总是将每一半除以 2。

复杂度:n*log(n) for the sort + N (for the check + split)

【讨论】:

  • 我不清楚这个答案。您能否提供一个包含 10 个元素的列表的示例解决方案? (如何做的描述,不需要代码或伪代码。)
【解决方案2】:

我们可以有一个时间复杂度为O(n * log(n) * N) 的简单动态程序,其中nA 中的元素数。假设数组是排序好的,让f(i, k)代表k元素的最优解的最大最小差,从第一个元素到ith元素中选择,那么:

f(i, k) ->
  max(min(A[i] - A[j], f(j, k - 1)))

for all k - 2 ≤ j < i

由于A[i] - A[j] 不会增加,f(j, k - 1) 不会随着j 的增加而减少,因此两者中的较小者表示单峰函数,因此我们可以在每次迭代中对最优 j 进行二分搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 2012-10-17
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多