我有n个数字和数字z。我想创建一个算法(伪代码)来查找是否有对(x,y),在O(nlogn)中x + y = z。
我以为我可以运行quicksort算法。然后我将有2个数组:array1(带元素< pivot)和array2(带元素> pivot)。 如果数组中的第一个元素是<那么我可以检查array1中的所有其他元素,找到x + y = z的对。 否则,如果array1中的第一个元素是> z,那么我将转到array2并执行相同的过程。 我的建议是真的吗?
答案 0 :(得分:9)
首先,对数组进行排序
然后在排序数组的每一端设置一个指针/索引
如果它们总和为z
,则保留它并将两个指针移向中间
如果总和小于z
,则将小端上的指针移向中间
如果总和大于z
,则将大端上的指针移向中间
当指针遇到/通过时,你已经完成了。
答案 1 :(得分:3)
使用数据透视的想法不会起作用,因为没有好的候选者用于数据透视,并且因为检查未分类的半范围将仍然是O(n)任务需要完成n / 2次, O(n 2 )的整体复杂性。
您可以在O(n)中执行此操作而不进行排序,方法是将所有元素添加到哈希表中,然后检查x
元素也存在的每个元素z-x
。 x=z/2
的情况是一种特殊情况,因为您需要验证输入数组中是否存在两个z/2
值。
答案 2 :(得分:2)
您无需对已排序的序列进行排序,只需进行搜索即可。
伪代码:
sort(sequence) // O(NlogN) sorts are well known
for element in sequence: // O(N) loop
target = z - element // constant (assuming fixed size arithmetic)
if target > min_element and target < max_element: // constant
found = binary_search(target, sequence) // O(LogN) search
复杂性:O(NlogN(排序)+(N(循环)* LogN(搜索)))= O(NlogN),根据需要