给定2个正整数的X和Y数组,x属于X,y属于Y,找到对(x,y),使得x + y <= k
答案 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回答