我们可以在O(n * log(n))中求解,找到对(x,y),x + y <= k

时间:2015-10-26 17:51:07

标签: algorithm

给定2个正整数的X和Y数组,x属于X,y属于Y,找到对(x,y),使得x + y <= k

2 个答案:

答案 0 :(得分:2)

可以在O(nlogn + m)中完成 - 其中m是输出的大小。

sort array X
sort array Y
for reach element x in X:
   for each y in Y in ascending order, and while y <= k-x:
       yield (x,y)

此算法的复杂性为O(nlogn + m)。但是,m本身可能是n中的二次曲面 - 例如,如果k非常大 - 您需要返回所有对,并且有O(n^2)个。

答案 1 :(得分:0)

在Stackoverflow上,您要求一种算法来配对两个数字 满足条件的数组。 a + b <= c。但是你删除了你的问题 在我回答之前。我不同意那些说它的人 不可能在O(n * log n)中找到对。

这取决于输出的紧凑度。如果你选择“好” 输出格式,即将对指定为区域允许您计算 通过对两个数组进行排序并对两个数组执行二进制搜索来进行对 阵列。但如果你被迫写出每一对,那么很明显 复杂度为O(n * n)。

一个例子:

a1 = [1,6,3,5,2,4]长度a1 = l1 = 6 a2 = [1,2,3,4,5,6]长度a2 = l2 = 6

首先对n * log n

中的两个数组进行排序

a1 = [1,2,3,4,5,6] a2 = [1,2,3,4,5,6]

比较值c = 5 l2 / 2 = 6/2 = 3

测试a1 [0] + a2 [l2 / 2] = 1 + 4 =&lt; 5(真) =&GT;因此对于小于a2 [l2 / 2]

的所有值都是如此

然后我们必须测试大于a2 [l2 / 2]的值 我们取数组右边的midlle(l2 / 2 + l2)/ 2(中位数) 并进行测试

测试a1 [0] + a2 [4] = 1 + 5 =&lt; 5(假)

因为左侧没有更多元素我们还没有测试过 可以从我们的上一次测试中得到结果。

我们现在可以说数组a1的索引0处的元素总和 数组a2的元素直到索引3通过测试并打印出来 结果[0,3]。

然后我们对数组a1的索引1处的元素重复该操作。等等。

你必须在O中排序两个数组(n log(n)) 然后打印两个排序的数组O(n) 然后执行二次搜索n次=&gt;为O(n 日志(*)) 结果打印在每个二进制搜索结束时=&gt;为O(n)

现在只需要正确解释输出即可。 ; - )

你怎么看?我是对的还是我错过了什么?你能用吗? 那个紧凑的输出?

Peter Paul Kiefer回答