选择具有最小总差异的数字对

时间:2016-09-30 12:31:22

标签: algorithm combinations difference

给定 n 对数字,选择 k 对,以使最小值和最大值之间的差异最小。请注意,1对中的2个数字不能分开。示例(n = 5,k = 3)

INPUT        OUTPUT (return the index of the pairs)
5 4          1 2 4
1 5
9 8
1 0
2 7

在这种情况下,选择(5,4)(1,5)(1,0)会产生5 的差异(最大值为5,min为0)。我正在寻找一种有效的方式(n log n)这样做,因为输入会非常大,我不想经历所有可能的情况。

谢谢。

注意:无需代码。对解决方案的解释就足够了。

2 个答案:

答案 0 :(得分:4)

以下是O(n log n)时间复杂度的方法:

首先根据对中较小的数字对数组进行排序。现在从排序数组中的最后一个元素(具有最小最小值的对)进行迭代。

当我们倒退时,已经访问过的元素必然具有与当前元素相等或更高的最小值。根据访问对中的最大号将访问对存储在最大堆中。如果堆大小小于k-1,请继续添加到堆中。

一旦堆大小等于k-1,就开始记录并比较到目前为止的最佳间隔。如果堆大小超过k-1,则关闭最大元素。堆保证包含第一个k-1对,其中最小数量大于或等于当前最小数量,最大值最小(因为当堆大小超过{{1时,我们继续弹出最大元素) }})。

总时间k-1用于排序+ O(n log n)以迭代并维护堆= O(n log n)

示例:

O(n log n)

答案 1 :(得分:0)

让我们保持对排序的数组:一个按照对的最小数量排序,另一个按最大值排序。让迭代遍历第一个数组并修复答案中的最小数字。我们可以将指针保持在第二个数组中的第k个数字上。当我们转到下一对时,我们从第二个数组中删除所有具有较小值的对,并在需要时转发指针。要在第二个数组中找到 log n 时间的位置,我们可以在对和位置之间保留额外的映射。